Rotacion, error con la posicion

Consulte acerca de programas, técnicas, algoritmos etc.

Rotacion, error con la posicion

Notapor Tras » Jue Dic 16, 2010 4:52 pm

Hola a todos.

Tengo un código de ejemplo que estoy realizando para practicar con sdl ya que hace mucho tiempo que no las uso, el caso es que el código consta de tres imágenes, la primera es la central ( el sol ) la segunda rota sobre la primera ( la tierra ) con estas dos imágenes no tengo ningún problema pero con la tercera si ( la luna ) que rota sobre la segunda ( la tierra ).

El problema con la luna es que no consigo que rote sobre la tierra en un circulo perfecto.

El codigo de la tierra rotando sobre el sol es este

Código: Seleccionar todo
x =(840/2)+(length * cos (angle));
        y = (680/2)+(length * sin (angle));
   imagen_earth.x = x;
   imagen_earth.y = y;


Uso el seno y coseno para trazar el circulo alrededor del sol.Para trazar el circulo alrededor de la tierra uso esto.

Código: Seleccionar todo
imagen_moon.x = (imagen_earth.x+42)+(length1 * cos ( angle ));
   imagen_moon.y = (imagen_earth.y+42)+ ( length1 * sin ( angle ));


Es decir le sumo 42 a la posición de la tierra y después con length trazo el radio , pero no consigo que el movimiento de la luna sobre la tierra sea circular.
La imagen de la tierra tiene un tamaño de 84px por eso uso 42 para intentar hallar el centro de la imagen y atraves de length hacer el radio.

Espero que se entienda el problema y que me puedan echar una mano en esto.

Saludos
Tras
 
Mensajes: 7
Registrado: Mar Ene 06, 2009 10:36 pm

Re: Rotacion, error con la posicion

Notapor carlostex » Dom Dic 19, 2010 9:35 pm

El problema esta en como manejas las coordenadas de la pantalla.
Supongo que sabrás que el origen esta arriba a la izquierda y las son positivas hacia abajo y hacia la derecha.Pero cuando usas operadores que trabajan sobre un plano cartesiano tienes que tomar en cuenta que en el plano no se puede representar la pantalla, lo mas cercano es el cuarto cuadrante pero sus posiciones en y con negativas, con la coordenada en x no hay problema pero para y tienes que restar una contante para situar el objeto donde tu quieras en la pantalla y multiplicarlo por -1

En tu codigo tienes:
Código: Seleccionar todo
x =(840/2)+(length * cos (angle));
        y = (680/2)+(length * sin (angle));


y debería ser:

Código: Seleccionar todo
x =(840/2)+(length * cos (angle));
        y = (680/2)-(length * sin (angle));


lo mismo con la luna.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Rotacion, error con la posicion

Notapor Tras » Lun Dic 20, 2010 1:20 am

Cierto ese era uno de los problemas , gracias por la indicación, la verdad es que no estoy muy puesto es coordenadas y las mates aplicadas a los gráficos :oops: , me va a tocar leer un poco sobre el tema :D .

Saludos.
Tras
 
Mensajes: 7
Registrado: Mar Ene 06, 2009 10:36 pm

Re: Rotacion, error con la posicion

Notapor carlostex » Lun Dic 20, 2010 1:49 am

Si eso es inherente, es cierto que para comenzar con juegos no necesitas mucha matemática, pero fíjate como el querer hacer rotar un cuerpo requiere de ciertos conocimientos de geometría y para cosas un tanto mas complejas se requieren de conocimientos de cálculo y física para juegos mas reales.
En el libro de sdl que hay en esta web hay una explicación de las coordenadas de la pantalla, y cuestiones geométricas.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Rotacion, error con la posicion

Notapor Tras » Mar Dic 21, 2010 12:40 am

En el libro de sdl que hay en esta web hay una explicación de las coordenadas de la pantalla, y cuestiones geométricas.


Si lo vi , lo estoy leyendo para recordar todos estos temas :P .

Saludos.
Tras
 
Mensajes: 7
Registrado: Mar Ene 06, 2009 10:36 pm

Re: Rotacion, error con la posicion

Notapor shackra » Lun Ene 03, 2011 9:47 pm

carlostex escribió:El problema esta en como manejas las coordenadas de la pantalla.
Supongo que sabrás que el origen esta arriba a la izquierda y las son positivas hacia abajo y hacia la derecha.Pero cuando usas operadores que trabajan sobre un plano cartesiano tienes que tomar en cuenta que en el plano no se puede representar la pantalla, lo mas cercano es el cuarto cuadrante pero sus posiciones en y con negativas, con la coordenada en x no hay problema pero para y tienes que restar una contante para situar el objeto donde tu quieras en la pantalla y multiplicarlo por -1


¿¡Qué!? :shock: no entendi naa xD
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica

Re: Rotacion, error con la posicion

Notapor kaiser » Mar Ene 04, 2011 12:54 am

Jajaja, la verdad que puede resultar un poco lioso si no se está familiarizado, se necesitan algunos conocimientos básicos de matemáticas/física:

Imagina una gráfica normal y corriente, el origen está situado abajo a la izquierda, los valores del eje X (eje horizontal) crecen hacia la derecha y los valores del eje Y (eje vertical) crecen hacia arriba. Éste es el sistema más común para representar coordenadas.

Imagen

SDL en cambio utiliza un sistema distinto, el origen está situado arriba a la izquierda, los valores del eje X (eje horizontal) crecen hacia la derecha y los valores del eje Y (eje vertical) crecen hacia abajo.

Imagen

Aquí te dejo una imagen de los cuadrantes de un plano cartesiano:

Imagen

Como ves el primer caso (caso común) se corresponde con el primer cuadrante, en cambio el caso de SDL se "parece" al cuarto cuadrante con la diferencia de que en el cuarto cuadrante los valores de Y crecen hacia arriba y en el caso de SDL crecen hacia abajo, pero eso se soluciona multiplicando por -1 los valores del eje Y, de ahí que carlostex diga que hay que restar y multiplicar por -1, ya que restar y multiplicar por -1 es equivalente a sumar, pero es necesario multiplicar por -1 para "dar la vuelta" al eje Y.

Un Saludo!
Última edición por kaiser el Jue Ene 06, 2011 1:10 pm, editado 1 vez en total
De la API al IDE y del IDE a la API.
Avatar de Usuario
kaiser
 
Mensajes: 121
Registrado: Mié Nov 24, 2010 7:47 pm
Ubicación: Madrid (España)

Re: Rotacion, error con la posicion

Notapor carlostex » Mar Ene 04, 2011 1:02 am

jeje, hay cosas para las que no soy bueno explicando, creo que queda mejor con una ejemplo.
tengo un punto en la coordenada X=100, Y=100 establezco un centro en cX=50,cY=100, quiero rotarlo 20 grados, primero
llevo el centro al origen, por que la operacion seno esta con referencia al origen del plano cartesiano, para eso resto X-cY e -Y+cX
lo que da X1=50, X1=0, ahora aplico X2=distancia_euclideana(X1,Y1)*coseno(20), y2=distancia_euclideana(X1,Y1)*seno(20), pero ese punto quedo en el primer cuadrante y no lo podemos poner así para representarlo en la pantalla, entonces se revierte la operación, quedando Xf=X2+cX, Yf=-Y2+cY y ese es el punto que se dibuja según las coordenadas de la pantalla.
Verifiqué las operaciones, pero si hay un error comentenlo.
Este método solo funciona para un punto a la misma altura que su centro.

Para facilitar las cosas y no estar pensando en esto siempre que queramos rotar o mover, tengo una biblioteca de funciones para hacer transformaciones geométricas, ya que todo se simplifica multiplicando por matrices de transformación, me ha sido muy útil.
Si alguien la quiere diganlo para que la busque y la suba a algún lado.

Edito: Acabo de ver el post de caiser, eso es lo que quise decir jeje, y pues esta explicación puede servir para implementar el código
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: Rotacion, error con la posicion

Notapor shackra » Jue Ene 06, 2011 2:08 am

carlostex escribió:jeje, hay cosas para las que no soy bueno explicando, creo que queda mejor con una ejemplo.
tengo un punto en la coordenada X=100, Y=100 establezco un centro en cX=50,cY=100, quiero rotarlo 20 grados, primero
llevo el centro al origen, por que la operacion seno esta con referencia al origen del plano cartesiano, para eso resto X-cY e -Y+cX
lo que da X1=50, X1=0, ahora aplico X2=distancia_euclideana(X1,Y1)*coseno(20), y2=distancia_euclideana(X1,Y1)*seno(20), pero ese punto quedo en el primer cuadrante y no lo podemos poner así para representarlo en la pantalla, entonces se revierte la operación, quedando Xf=X2+cX, Yf=-Y2+cY y ese es el punto que se dibuja según las coordenadas de la pantalla.
Verifiqué las operaciones, pero si hay un error comentenlo.
Este método solo funciona para un punto a la misma altura que su centro.

Como? :shock: gloool, solo bromeo, ya me quedo mas claro con la explicación de Kaiser :P
tengo conocimientos de fisica, en el colegio fui el unico que escogio hacer el examen de bachiderato de Fisica en el area de ciencias en un colegio tecnico (en los colegios tecnicos solo se fisica en 4to año, en los colegios academicos se da Fisica desde 4to hasta 6to año)... no lo pasé a la primera, pero en la convocatoria lo pase :P

gracias por la explicacion :D
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron