Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda!!

Iniciado por tywok, 12 de Diciembre de 2002, 07:40:18 PM

« anterior - próximo »

tywok

                                buenas, necesito hacer un programa q me rote un triangulo alrededor de un punto, no creo q sea muy xungo, pero lo tengo q hacer en delphi.mas o menos he pensado como lo tendria q hacer pero no estoy seguro de si funcionaria.primero seria dibujar el triangulo, luego sacar las coordenadas de los vertices respecto al punto q voy a rotar, no? luego necesitaria sacar el angulo q tiene respecto con el punto sobre el q roto y con la horizontal. cuando tengo el angulo seria aumentarlo y luego volver a sacar los puntos y redibujarlo, no??

pos mi problema es q no tengo muxa idea de trigonometria y no lo veo nada claro. me podriais ayudar??? luego otra pregunta es q como pongo sen^-1, se puede hacer en delphi???me daria la inversa del seno o el angulo??

un saludo y gracias x adelantado
tywok                                

Lord Trancos

                                puedes explicar un poco mejor que tipo de programa quieres hacer? es decir,... para q quieres un triangulo rotando alrededor de un punto??? supongo q te refieres a un triangulo 3D, no? lo quieres en wireframe ? con textura ? para q tipo de usuario ? para q tipo de maquina ? no se.... explicalo un poco mejor :P

lo digo pq a lo mejor con GDI lo puedes hacer o a lo mejor es mejor q uses OpenGL o DirectX.

lo de sen^-1 no lo entiendo.... ¿seno elevado a -1?                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Mars Attacks

                                arcoseno, supongo, para sacar el valor de un ángulo dado su seno. ¿Me equivoco?

De todas formas, jefe, lo que tú buscas (creo) se llama matriz de rotación.
Tienes tres vértices que forman una figura y quieres rotar la figura sobre un eje (las rotaciones son sobre ejes, no sobre puntos). Lo que deberías de hacer es lo siguiente (igual meto la pata porque esto es de hace un par de años de clase, si me equivoco o no es lo que buscas que alguien me corrija):

Lo primero y más importante: pon los puntos de forma que el eje sobre el que quieras rotarlo (pongamos que quieres el eje Y, que es el más normal) pase por su centro, así:



     Y|

      *

      |

   *  |__*__X

     /

  Z/


Espero que salga bien.

Después sólo tienes que decirle que la nueva posición de cada vértice será su posición original multiplicada por


| cos(alfa)  0 sin(alfa) |

| 0          1 0         |

| -sin(alfa) 0 cos(alfa) |


(se supone que es una matriz 3x3)

O lo que es lo mismo, para los (x,y,z) de cada vértice haces
nuevovectorxyz=(x,y,z)*Matrizanterior

Ya te digo que no me hagas mucho caso porque igual no es esto lo que preguntas, pero eso que te he descrito es cómo puedes rotar un triángulo como el de la figura ascii alrededor de su eje Y según el valor alfa que le pongas. Y si quieres una animación, sólo tendrías que hacer un bucle donde le dijeras que incrementara alfa en cada iteración después de haber hecho la multiplicación y antes del dibujado. ¡Y ya está!
Espero que te sirva de algo  :ojo:                                

Mars Attacks

                                Oh, y si lo necesitas en 2D (y por eso te refieres a un punto, que en realidad sería el eje Z que queda perpendicular a la visión y por tanto sólo se ve como un punto), sería más o menos lo mismo pero así:

| cos(alfa) -sin(alfa) |
| sin(alfa)  cos(alfa) |


Y para los (x,y) de cada vértice haces
nuevovectorxy=(x,y)*Matrizanterior

Recuerda que (en este caso) el eje de rotación debería estar justo en el centro de gravedad del triángulo (o de donde quieras rotarlo):



     Y|

      *

      |______X

   *     *



Como estoy algo harto del ascii, te he hecho un pequeño render para que veas cómo quedaría:



Lo borraré dentro de unos días, espero que te dé tiempo a verlo.                                

tywok

                                muchas gracias, mars attack, ya lo he conseguido, aunque tuve unos problemillas con los radianes y demas...
en fin, muchas gracias x ayudarme tan rapido
un saludo tywok                                

Mars Attacks

                                Comenzaba a pensar que nadie leería mi post y habría pasado dos horas currando para nada. (fueron dos horas largas entre editar una y otra vez el mensaje para que los asciis se vieran bien y después ponerme a hacer el render y subirlo a mi web en anubis -el servidor de la universidad jaume I que casca más que una escopeta de feria y por eso hace un par de días que no va-, etc etc).

Al menos si ha servido para algo, compensa con creces. Me alegra haberte servido de ayuda (y perdón por lo de los radianes, se me pasó comentarlo). Por cierto, hablando de los radianes, si los vas incrementando para el efecto de rotación, recuerda poner una condición que diga que si el radián es mayor o igual que 2*pi haga radián=radián-2*pi
Así no tendrás ningún problema de desbordamiento. En grados sería equivalente a decirle que si el valor es mayor o igual que 360 (una vuelta completa), haga grados=grados-360 (para tener el valor equivalente en grados desde 0 a 360).
Nada más, un saludo y a mandar.                                

tywok

                                pufff, te tiraste dos horas... muchisimas gracias!!!
pero una pregunta... si metes x ejemplo el coseno en radianes de 370º no será igual al de 10º??, es decir, modulo de 360, no??
un saludo                                

Mars Attacks

                                Exacto. Da lo mismo hacer grados=(grados++) mod 360 que
if (grados++>=360) then grados=grados-360

y además te ahorrarías un if. Eso sí, si lo haces tal y como lo he puesto. Pero si lo haces de esta otra forma:

grados=(numgrados) mod 360

donde numgrados sea una variable que vayas incrementando todo el rato, puedes tener problemas con el desbordamiento de numgrados.
Así que te recomiendo encarecidamente la primera forma,
grados=(grados++) mod 360

(o grados=(grados+incremento) mod 360)

En realidad no llegó a la hora XD pero no hay de qué. A mandar.                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.