Del código anterior hay que destacar lo siguiente: en la línea 26 se fija el tamaño del punto de 12 pixeles en la función glPointSize. En las líneas 29, 31, 33 y 35 se utiliza el método glVertex2f [TutorialOpenGL, 2016], cuyos parámetros son dos valores de punto flotante que representan la posición en dos dimensiones. Y en las líneas 28, 30, 32 y 34 el método glColor3f especifica el color para cada uno de los puntos a dibujar; los parámetros son la intensidad de los colores Rojo, Verde y Azul desde 0 a 1. En la línea 34 los parámetros son ceros, lo que significa que no hay intensidades de los tres colores, por lo tanto, hay una ausencia de color, que genera el negro. Cuando los tres valores correspondientes a los colores están a su máxima intensidad (o sea, 1), generan el color blanco.
Se observa que se generan puntos de diferentes colores, pero podemos generar más gráficas primitivas. Por ejemplo, para generar una línea es necesaria la característica GL_LINES y además un par de vértices que indican dónde empieza y dónde termina la línea correspondiente, como se muestra en la figura 3.3 a continuación [Villar, 2009].
Figura 3.3 Primitivas gráficas
Fuente: Apuntes de Villar Patiño.
Práctica
1. Modifique el programa Puntos2D para que presente la siguiente salida.
Genere un nuevo programa para que cuadricule cada unidad del plano cartesiano con las líneas azules y los ejes en negro.
Observe la siguiente tabla de colores
Figura 3.4 Tabla de colores de Windows
Fuente: Elaboración propia
Para trabajar con el color escogido se usa el método glColor3i(15,31,172), que genera la salida mostrada en la figura 3.5, pero no proporciona el color esperado. Con ello surge la pregunta: ¿Existe un método que nos ayude a generar la salida esperada, utilizando los mismos valores de los colores?
Figura 3.5 Gráfica de la secante.
Fuente: Elaboración propia.
La respuesta es sí con el método glColor3d(15/256.0, 31/256.0, 172/256.0), que se puede observar en la línea 31 del siguiente código. Hay que resaltar los parámetros del método; estos se transcriben, por ejemplo, 15/250.0: se debe a que, si se escribe 35/256, como los dos valores son enteros la división regresaría un entero, el cual es 0. Al escribir 256.0 se le dice a java que el valor es uno de doble precisión y el resultado es un valor de doble precisión.
Figura 3.6 gráfica del seno
Fuente: Elaboración propia.
El siguiente código, en una nueva clase, genera la salida de la figura 3.6, llamado GraficasTrigonometricas.
1. public void init(GLAutoDrawable glad) {
2. final GL2 gl = glad.getGL().getGL2();
3. final GLU glu = new GLU();
4. gl.glMatrixMode (GL2.GL_PROJECTION);
5. gl.glClearColor (1.0f, 1.0f, 1.0f, 0.0f);
6. glu.gluOrtho2D (-10.0, 10.0, -1.2, 1.2);
7. gl.glMatrixMode(GL2.GL_MODELVIEW);
8. gl.glLoadIdentity();
9. }
10. public void display(GLAutoDrawable glad) {
11. final GL2 gl = glad.getGL().getGL2();
12. gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
13. gl.glLoadIdentity();
14. dibujaEjes(gl,-9f,9f,-1f,1f);
15. dibujaSeno(gl);
16. gl.glFlush();
17. }
18. public void dibujaEjes(GL2 gl,float xi,float xf,float yi, float yf){
19. gl.glLineWidth(10f);
20. gl.glColor3f(0.0f, 0.0f, 0.0f);
21. gl.glBegin(GL2.GL_LINES);
22. gl.glVertex2f(xi, 0.0f);
23. gl.glVertex2f(xf, 0.0f);
24. gl.glVertex2f(0.0f, yi);
25. gl.glVertex2f(0.0f, yf);
26. gl.glEnd();
27. }
28. public void dibujaSeno(GL2 gl){
29. double inc, x;
30. inc=Math.PI/50;
31. glColor3d(15/256.0, 31/256.0, 172/256.0);
32. gl.glLineWidth(5f);
33. gl.glBegin(GL2.GL_LINE_STRIP);
34. for(x=-9;x<=9;x+=inc){
35. gl.glVertex2d(x, Math.sin(x));
36. }
37. gl.glEnd();
38. }
Código 3.2 GraficasTrigonometricas.java
De la línea 18 a la 27 se tiene la función dibujaEjes que dibuja los ejes de la gráfica con un grosor de línea de 10 pixeles (línea 19), de color negro (línea 20) y con dos vértices para el valor de x inicial y x final; a su vez, dos vértices para el eje y (líneas de la 22 a la 25). Posteriormente se transcribe la función dibujaSeno que dibuja la gráfica del seno(x) desde -9 hasta 9 y los puntos de los vértices se equidistan una longitud de π/50; como se podrá observar en el ciclo for de la línea 34. De la línea 33 a la línea 37, se observa que se genera una serie de vértices que son unidos por la característica GL_LINE_STRIP que, se puede ver en la figura 3.3, une todos los vértices con líneas desde el primero hasta el último. Como los vértices están muy juntos, a simple vista se observa una curva, pero todas son líneas rectas.
Se puede observar que en el método display, en la línea 14, se manda llamar al método dibujaEjes con los parámetros: el objeto gl, los valores de punto flotante -9f del x inicial, 9f del x final, -1f del y inicial y 1f del y final. En la línea 15 se invoca al método dibujaSeno que lleva como parámetro al objeto gl para poder dibujar la gráfica. Por ello se dibujan los ejes primero y encima de ellos a la gráfica del seno; esta manera de dibujar se analizará más adelante en el trabajo.
Práctica. Para cada función trigonométrica siguiente se debe poner un color diferente para dibujar la gráfica.
1. Coseno
2. Tangente
3. Cotangente
4. Secante
5. Cosecante
Continuando con el manejo de las gráficas primitivas, se realizará el fractal del triángulo de Sierpinsky. En una clase llamada Sierpinsky se modifcan los métodos siguientes, agregando además el método dibujaTriangulo.
1. public void init(GLAutoDrawable glad) {
2. GL2 gl = glad.getGL().getGL2();