Anteriormente vimos cómo dibujar un hexágono, octágono y un círculo con JOGL pero nunca redimensionamos el frame que los contenía. ¿La razón? pues porque no habíamos modificado el método reshape() utilizado por la interfaz GLEventListener, entonces, al redimensionar un frame puede ocurrir que nuestra figura se distorsione tal y como se ve en ésta imagen:


Circunferencia deformada al redimensionar el JFrame.


Para evitar lo anterior, debemos modificar el código contenido dentro del método reshape() de la siguiente manera:

public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
{
// Cargamos la proyección de nuestra imagen
gl.glMatrixMode (GL.GL_PROJECTION);
gl.glLoadIdentity ();

// Cuando el alto es más grande que el ancho
if (w <= h)
{
// Modificamos el fondo (bottom) y la parte de arriba (top) de
// tal manera que no se deforme nuestra figura
gl.glOrtho(-xRange, xRange,
-yRange * ((float)h/(float)w), yRange * ((float)h/(float)w), -zRange, zRange);
}
// Cuando el ancho es más grande que el alto
else
{
// Modificamos el lado izquierdo (left) y el lado derecho (right) de
// tal manera que no se deforme nuestra figura
gl.glOrtho(-xRange * ((float)w/(float)h), xRange * ((float)w/(float)h),
-yRange, yRange, -zRange, zRange);
}
// Se carga el punto de vista del modelo
// con las nuevas dimensiones (width, height)
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glViewport(x, y, width, height);
// Redibujamos el objeto
canvas.repaint ();
}

Como se puede apreciar en el método anterior, hemos utilizado tres variables nuevas: xRange, yRange, zRange, dichas variables definirán nuestro espacio de trabajo y deben ser declaradas e inicializadas en el constructor de nuestro programa:

float xRange = 5.0f;
float yRange = 5.0f;
float zRange = 5.0f;

Con lo anterior, nuestro espacio de trabajo seguirá comprendiendo los rangos:
  • x = [-5,5]
  • y = [-5,5]
  • z = [-5,5]
El método reshape recibe como parámetros cuatro variables:
  1. GLAutodrawable drawable
  2. int x
  3. int y
  4. int width
  5. int height
Dichas variables definen las nuevas dimensiones de nuestro objeto contenido en GLCanvas y es necesario manipularlas para que la figura final no se deforme. De esta manera, al momento de redimensionar el frame que contiene la figura, no importando si la anchura o altura se incrementa, la figura mostrada dentro del objeto GLCanvas permanecerá sin deformaciones tal y como se muestra en las figuras siguientes:







Si desean descargar el código fuente pueden dar click en el siguiente enlace:

Descargar código fuente dibujarCircunferenciaNODeforme.java

8 opiniones:

McQueen dijo...

Quiero felicitarte por tu blog, todo un descubrimiento. Espero que un dificil comienzo en cuanto a público no te frene y sigas adelante.

Un saludo desde España :)

CaArLozX dijo...

Gracias por tu comentario. Últimamente he estado un poco ocupado con otros proyectos pero próximamente publicaré más ejemplos, tanto en 2D como en 3D.

carlos dijo...

ola men esta bueno me gustaria preguntarte una cosas pero no pasa casi por aca te agregue al msn pero no te veo si quieres agregame krodriguez777@hotmail.com para ver si me puedes ayudar en algunas cosas si puedes claro esta

MomO dijo...

Hola CaArLoz muy chido tu blog! te felicito. Estoy aprendiendo mucho.. Lo que mi profesor debio enseniarme lo estoy aprendiendo contigo. En fin solo queria felicitarte y que sigas asi. Eres todo un buenazo.

MomO dijo...

Una cosa mas CaArLoz!! Los links me aparecen rotos! Aun asi yo los intento hacer y algunos si me quedan pero otros no muy bien! Si pudieras ayudarme con eso. Gracias y Saludos! Q estes bien.

CaArLozX dijo...

Saludos MomO y a todos los visitantes.

Éste blog hace tiempo que ya no lo actualizo, lo comencé cuando aún estudiaba y, ahora trabajo y no tengo tiempo para escribir.

Les paso el link con todos los programas que puse en el blog.

https://skydrive.live.com/?cid=4e1f69ddde32def5#!/?cid=4E1F69DDDE32DEF5&id=4E1F69DDDE32DEF5%21177

Gracias.

Anónimo dijo...

I blog quite often and I seriously thank you for your content.
This great article has really peaked my interest.

I will book mark your site and keep checking for new details about once a
week. I subscribed to your Feed too.

My page :: laser cellulite treatment

Anónimo dijo...

The oldest documented stylе of massagе. Don't forget the landlord or owner of the place. Shake the oil well. Symptoms of cerebral palsy vary from mild to severe. Stress is often an appropriate complementary treatment. Cerebral palsy CP is a term of respect on the islands of Hawaii, not a blood relationship term.

Also visit my blog post: tantra