Docencia Autor

Proyección avanzada 3D en un plano. Gráficos 3D

Una ecuación con dos variables independientes y una dependiente como

    Z = Seno(X) + Coseno(Y)

Se representa en un espacio 3D. Observe que X, Y son independientes, Z es dependiente.

Paso 1: Capturando los datos
En consola
a. El usuario final digita el rango de X: Desde Xmin hasta Xmax. Validar que Xmin < Xmax
b. El usuario final digita el rango de Y: Desde Ymin hasta Ymax. Validar que Ymin < Ymax
c. El usuario final digita el número de líneas que conformará la malla o modelo de alambre (wireframe). Validar que el numero de líneas sea mayor de cero.

Paso 2: Deduciendo las constantes de progreso
a. Determina el progreso de los ciclos de esta manera:
    ProgresoX = (Xmax-Xmin)/número de líneas
    ProgresoY = (Ymax-Ymin)/número de líneas

Paso 3: Deduciendo valores mínimos y valores máximos
a. Se deducen los valores de la variable Z calculándola de esta manera:

Desde ValorX=Xmin hasta Xmax avance ProgresoX
    Desde ValorY=Ymin hasta Ymax avance ProgresoY
        Z = funcion_algebraica(ValorX, ValorY)

Ejemplo:

for (ValorX=1; ValorX<=3; ValorX+=1)
    for (ValorY=1; ValorY<=10; ValorY+=1)
        Z = Math.sin(ValorX) + Math.cos(ValorY);

X Y Z=sin(x)+cos(y)
1 1 1,381773291
1 2 0,425324148
1 3 -0,148521512
1 4 0,187827364
1 5 1,12513317
1 6 1,801641271
1 7 1,595373239
1 8 0,695970951
1 9 -0,069659277
1 10 0,002399456
2 1 1,449599733
2 2 0,49315059
2 3 -0,08069507
2 4 0,255653806
2 5 1,192959612
2 6 1,869467713
2 7 1,663199681
2 8 0,763797393
2 9 -0,001832835
2 10 0,070225898

Cada X, Y, Z es una coordenada 3D.
Convierta cada coordenada (X,Y,Z) en una coordenada plana así:

Xplano (float) = (DistPantallaOjO * X - Z * DistNarizOJO) / (DistPantallaOjO - Z)
Yplano (float) = (DistPantallaOjO * Y) / (DistPantallaOjO - Z)

Donde:
DistPantallaOjO es la distancia entre el centro de la pantalla proyectado en línea recta hacia su ojo (usualmente son 50 centímetros, si trabaja en centímetros)
DistNarizOjO es la distancia desde la nariz hasta su ojo (usualmente 3,5 centímetros)

Deduzco entonces el mayor valor de Xplano y el menor valor de Xplano
Deduzco entonces el mayor valor de Yplano y el menor valor de Yplano
 

Paso 4: Deduciendo las constantes para cuadrar el gráfico

Calculo las constantes para cuadrar la gráfica (float)
 

Paso 5: Graficando
a. Deduzco los valores de la ecuación que voy a graficar, las coordenadas x,y,z
b. Convierto de 3D a 2D
c. Convierto a coordenadas enteras (pixeles) utilizando las constantes para cuadrar la gráfica y eso serán los puntos de pantalla
d. Dibuje las líneas entre los puntos
 

Paso 6: Resultado
a. Si hizo todo los pasos anteriores este debería ser el resultado:

¿Eso? ¿Líneas verticales? Relájese, aunque usted no lo crea esa es la representación correcta de la ecuación, lo que pasa es que usted esta juzgando mal, esta viendo la gráfica desde arriba (el eje Z sale del centro de la pantalla hacia su nariz), luego no es posible ver las crestas o los valles de la ecuación.

 

Paso 7: Girando la gráfica en X o en Y o en Z
Para poder ver la gráfica como en la imagen:

Cambiando un poco el programa.
En consola
a. El usuario final digita el rango de X: Desde Xmin hasta Xmax. Validar que Xmin < Xmax
b. El usuario final digita el rango de Y: Desde Ymin hasta Ymax. Validar que Ymin < Ymax
c. El usuario final digita el número de líneas que conformará la malla o modelo de alambre (wireframe). Validar que el numero de líneas sea mayor de cero.
d. El usuario final digita el ángulo de giro en X. Validar que el ángulo esté entre 0 y 90.

e. Determina el progreso de los ciclos de esta manera:
    ProgresoX = (Xmax-Xmin)/número de líneas
    ProgresoY = (Ymax-Ymin)/número de líneas

f. Se deducen los valores de la variable Z calculándola de esta manera:

Desde ValorX=Xmin hasta Xmax avance ProgresoX
    Desde ValorY=Ymin hasta Ymax avance ProgresoY
    {
         Z = funcion_algebraica(ValorX, ValorY)
       

         //Aplique la matriz de giro en x,y,z
         Xgirado= ....matriz de giro en el ángulo que digito el usuario.....
         Ygirado= ....matriz de giro en el ángulo que digito el usuario.....
         Zgirado= ....matriz de giro en el ángulo que digito el usuario.....
 

        //Cada Xgirado, Ygirado, Zgirado es una coordenada 3D.
        //Convierta cada coordenada (Xgirado,Ygirado,Zgirado) en una coordenada plana así:

        Xplano (float) = (DistPantallaOjO * Xgirado - Zgirado * DistNarizOJO) / (DistPantallaOjO - Zgirado)
        Yplano (float) = (DistPantallaOjO * Ygirado) / (DistPantallaOjO - Zgirado)

        Deduzco entonces el mayor valor de Xplano y el menor valor de Xplano
        Deduzco entonces el mayor valor de Yplano y el menor valor de Yplano       
}

g. Calculo las constantes para cuadrar la gráfica (float)

h. Deduzco los valores de la ecuación que voy a graficar, las coordenadas X,Y,Z
y las giro
b. Convierto de 3D a 2D
c. Convierto a coordenadas enteras (pixeles) utilizando las constantes para cuadrar la gráfica y eso serán los puntos de pantalla
d. Dibuje las líneas entre los puntos.

 


Enlaces interesantes

http://www.luventicus.org/articulos/03U009/index.html
http://www.ies.co.jp/math/java/
http://www.mste.uiuc.edu/java/
http://math.hws.edu/javamath/