• Martes 14 de Mayo de 2024, 08:28

Autor Tema:  Transformacion De Figuras En 2d (x,y)  (Leído 2073 veces)

scullyERA

  • Miembro activo
  • **
  • Mensajes: 42
  • Nacionalidad: 00
    • Ver Perfil
Transformacion De Figuras En 2d (x,y)
« en: Martes 7 de Febrero de 2006, 19:47 »
0
-----Hola a todos. Estoy entrando apenas a la graficación y sus principios y me acaban de dejar un proyecto en el que tenemos que hacer que un cochecito pueda ser movido por el usuario y cuando llegue a una esquina cualquiera se pueda rotar (90° grados a la izquierda o derecha o 180° en el caso de regresar por el mismo camino). Con la traslación creo no tener problemas, pero con respecto a la rotación tengo 2 problemas:

-----En el caso de usar las fórmulas
x'= cos (angulo) * radio
y'= sen (angulo) * radio
necesito saber el angulo al que se encuentra el punto a rotar, en el caso de 0°, 45°, 90° y múltiplos de estos no hay bronca, pero sólo cuando yo le pongo el "angulo normal" en que se encuentra; pero no siempre se encuentran en estos angulos y NO SÉ NI ENCUENTRO UNA FORMA EFICIENTE Y LIBRE DE ERRORES de cómo conseguir el ángulo en el que se encuentra el punto para después rotarlo n grados; como un principio hice lo sig:

Código: Text
  1. struct PUNTO
  2. {int x,y;};
  3.  
  4. float angulo (PUNTO p, PUNTO p0, float r)
  5. {float a=0; //el angulo
  6.  PUNTO q; //punto a rotar
  7.  
  8.  do
  9.   {a+= (0.001*PI)/180; //incrementamos el angulo actual en 0.001 grados
  10.    q.x= p0.x +r* cos (a); //conseguimos el nuevo valor de x
  11.    q.y= p0.y -r* sin (a)&#59; //conseguimos el nuevo valor de y
  12.   } while (q.x != p.x && a< 2*PI || q.y != p.y && a< 2*PI);
  13.  
  14.  if (a >= 2*PI) //si el angulo es mayor o igual a 360 grados
  15.    printf ("Las coordenadas del punto son (%d,%d)",
  16.      q.x -maxx/2, q.y -maxy/2);
  17.  
  18.  return a;
  19. }
  20.  
-----Lo que hice era teniendo un punto p (componentes x,y) y un eje de rotacion p0. De acuerdo a su distancia r rotaba un punto q desde al angulo cero hasta que sus componentes (x,y) concordaran exactamente con los del punto p original, y el angulo final era el supuesto angulo del punto p, pero como verán este metodo es muy subjetivo y tiene sin duda errores.
-----Después lo intenté hacer con las fórmulas
x'= x * cos (angulo) - y * sen (angulo)
y'= x * sen (angulo) + y * cos (angulo)
pero en el proceso de rotación, el radio entre el eje de rotación y el punto no se mantenía constante y me hacía unos desajustes que no comprendo.

-----Por lo que tengo entendido (he escuchado) se necesita uso de matrices para rotar un punto, alguien me podría decir cómo se le hace para rotar un punto?? Les agradecería mucho una explicación o ayudadita de cómo hacerlo.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Transformacion De Figuras En 2d (x,y)
« Respuesta #1 en: Martes 7 de Febrero de 2006, 21:48 »
0
Veo que te falta base matemática, lo que necesitas es la funcion arco de la tangente, y mejor el clasico "atan2", que recibe los delta x y delta y y de devuelve el angulo.

Incluso se hace en ensamblador con 4 instrucciones.  :whistling:

       FLD     Y
       FLD     X
       FPATAN
       FWAIT

P.D. Lo natural siempre es usar radianes. Desecha los "grados", eso solo sirve para mostrar informacion final, nunca los metas en tus calculos internos.

patitofeo

  • Miembro MUY activo
  • ***
  • Mensajes: 145
    • Ver Perfil
Re: Transformacion De Figuras En 2d (x,y)
« Respuesta #2 en: Jueves 9 de Febrero de 2006, 13:13 »
0
Si solo necesitas rotar a razon de 90º o 180º yo te aconsejo que no utilices trigonometria y hagas tratamiento matricial que es mas rapido y eficiente.

para rotar una imagen 90º solo tienes que hacer la transpuesta

para rotar 180º invierte el orden de las columnas y de las filas

para rotar 270º las suma de ambas.

Asi te ahorras hacer el calculo trigonometrico de cada pixel.

Saludos :hola:

Solman

  • Miembro MUY activo
  • ***
  • Mensajes: 151
    • Ver Perfil
Re: Transformacion De Figuras En 2d (x,y)
« Respuesta #3 en: Lunes 13 de Febrero de 2006, 13:31 »
0
yo logre hacer eso q quieres hacer mira lo puedes bajar..... jeje :P


http://www.tiendaguadalajara.com/descargasvj.php?inicio=12