Vida Estudiante
Menú
Gamersmafia es ahora un archivo de solo lectura.

Proyectar una elipse en un sistema de coordenadas en 3D

Buenas, a ver si me podéis echar un cable. Antes de nada os pongo en situación:

El año pasado en una asignatura de programación, en una de las prácticas hice un sistema de órbitas planetarias muy básico. Estaba programado en C++ usando solo canvas siendo por tanto un dibujo en dos dimensiones. Quedó bastante chulo pero era algo limitado, ya que por ejemplo, no podía tener en cuenta la inclinación orbital de los planetas.
Este año en una asignatura optativa llamada Informática Gráfica, seguimos programando en c++, solo que usamos APIS gráficas como OpenGL o DirectX para poder hacer cosillas como videojuegos o pequeñas simulaciones. Eso me da más libertad y puedo trabajar en un sistema de coordenadas de tres dimensiones mucho más fácilmente, por lo que me había propuesto reaprovechar la práctica del año pasado para practicar un poco, introduciendo dicho factor de inclinación orbital y ya veré si otros más mas adelante.

Hasta ahora he conseguido ya hacer un sistema de órbitas elípticas sobre un plano simple, por lo que decidí introducir el atributo de inclinación orbital. El principal problema es que aunque una órbita elíptica está sobre un plano, en el momento en el que inclinas ese plano, la elipse gana automáticamente una coordenada más que no sé como calcular, por lo que procedí a hacer un invento que funciona a medias:

Calculo primero la posición del planeta en el plano y a continuación inclino las coordenadas x grados para ponerlas en su posición (como si pones un punto con bolígrafo en la puerta, y a continuación la abres unos grados, el punto se desplaza con la puerta al nuevo plano que has abierto). El caso es que funciona solo a medias, cuando va por la mitad de la órbita (es decir, cuando el planeta llega a la posición donde el plano inclinado se corta con el plano no inclinado),  empiezan a suceder cosas raras.

¿Qué busco?
Podéis tratar de ayudarme de varias maneras:

1) Voy a pastear más abajo el código de la parte del programa que recalcula las posiciones del planeta, si tenéis alguna idea de algo que debería cambiar para que funcione y funciona eso, entonces premio para el que consiga encontrar el error que yo no veo.

2) Buscar una forma alternativa de calcular las coordenadas de un planeta en una órbita inclinada. Lo idóneo sería algo que trabaje con fórmulas matemáticas lo más parecidas posible a las ecuaciones paramétricas de la elipse pero que me permita trabajar con 3 coordenadas en vez de con 2, ya que actualmente esas fórmulas son las más cómodas para programar.

Código:
Código del programa

Algunas cosas a tener en cuenta:

- En mi sistema de coordenadas, la y es la vertical, la x la horizontal y la z la profundidad.
- El sol (que es el foco de la elipse) se encuentra situado en (x,y,z) = (0,0,0)
- Las fórmulas que uso son básicamente las paramétricas.
- Si tenéis alguna duda más del código, intentaré explicarlo más.
- Como me parece una cuestión bastante jodida, ofrezco una suculenta recompensa (500 gmfos) al que me dé una solución o descubra lo que falla en el código para que funcione. Si nadie da con una solución pero me dais ideas frescas para pensar en otras direcciones diferentes, repartiré gmfos entre las ideas que me sean más útiles para desarrollar un nuevo algoritmo.



Recompensa: 500
Mejor respuesta

Hola,

No puedo mirarme con detalle el algortimo de momento, pero ya te digo que yo trabajaría en este punto:
double hipotenusa = sqrt(_x_x+_y_y+_z*_z);
double radio = sin(anguloAux) * hipotenusa;
if (radio < 0)
radio = -radio;

Piensa que hipotenusa es igual a dos valores, ya que es el resultado de una raíz cuadrada, por lo que estás obviando el negativo del negativo (una de las dos soluciones), que probablemente te esté provocando esos valores ‘extraños’ cuado los dos planos se cortan.

No creo que esa sea la solución, pero vale para ir mirando.. si tengo un ratito me pongo.

Regards(las plantas)

por SinSa

creo que te has confundido de web , la pagina de la NASA es esta www.nasa.gov

Informativo
#4

Hola,

No puedo mirarme con detalle el algortimo de momento, pero ya te digo que yo trabajaría en este punto:
double hipotenusa = sqrt(_x_x+_y_y+_z*_z);
double radio = sin(anguloAux) * hipotenusa;
if (radio < 0)
radio = -radio;

Piensa que hipotenusa es igual a dos valores, ya que es el resultado de una raíz cuadrada, por lo que estás obviando el negativo del negativo (una de las dos soluciones), que probablemente te esté provocando esos valores ‘extraños’ cuado los dos planos se cortan.

No creo que esa sea la solución, pero vale para ir mirando.. si tengo un ratito me pongo.

Regards(las plantas)

Divertido
#5

La c)
¿no?

Bueno, ya lo he arreglado por mi cuenta. Lo he consultado con la almohada y esta mañana se me ha ocurrido hacer inventario de todos los ángulos y datos que tengo por ahí metidos, me he hecho algún dibujito y al final he conseguido aclarar las ideas:

  • He borrado lo de hipotenusa, ya que no lo necesitaba y en su lugar he cogido un radio que calculo desde el punto que tengo en el plano hasta el eje de rotación para proyectar:

double radio = sqrt(_x_x+_y_y);

A continuación he arreglado la siguiente condición:

// Pasamos a radianes la inclinación
if(_x > 0)
anguloAux = (3.14 * _inclinacion) / 180;
else
anguloAux = (3.14* (180 + _inclinacion)) / 180;

Y por último, proyecto los puntos:

if(radio != 0)
{
_x = radio * cos(anguloAux);
_y = radio * sin(anguloAux);
}

Y funciona.

Tenía todo un follón montado entre el ángulo de inclinación y el ángulo de proyección y no conseguía sacar el radio de giro (cuando solo había que hacer la raiz cuadrada de x al cuadrado + y al cuadrado, así que el que más se ha aproximado a la parte del código que estaba causando problemas ha sido sinsa (aunque el problema era otro distinto del que él comentaba). Como el problema era ligeramente distinto al que él comentaba pero al menos me ha intentado responder y se ha acercado bastante a la zona fastidiada del algoritmo, le daré la recompensa a él.

Gracias Sinsa.

Hola,

Gracias a tí.
Estaba creando un proyecto para implementar tu algoritmo. No podía ahondar más en el problema sin poder reproducirlo.
Ahí me las den todas..

Regards(las plantas)

Divertido
#8

No es por ná, pero esta pregunta con su merecida respuesta, en una noche aciaga de sexo y drogas, puede ser el pelotazo necesario para irse al otro barrio…. por dios que rallao me habeis dejao.

Sinsa Hipotenusate!

A ver, slnc, ya me está usted creando una medalla que sea de “hipotenuso de los cielos” o algo así pal sinsa

Top sabios
ObiJu 186
Draco351 110
Mave 105
Alim_Jah 97
ReNeGaDo 72
2_Face 60
Casti 60
AlbeR. 57
Anferne 50
Samu. 49
Un punto = una mejor respuesta
Más preguntas de Flash-Hack