Web de empleos sobre videojuegos, diseño y programación en España

Started by peterpollito, December 19, 2010, 09:59:56 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

HaCkZJuaNN

Quote from: Drumpi on December 23, 2010, 02:31:15 PM
Lo resolví de una forma tan sencilla que me asombré yo mismo:
-Usando la arcotangente averiguamos el ángulo respecto del primer punto del segundo y del tercero.
-Por el mismo método, hayamos el ángulo del punto desconocido respecto al primer punto, y comprobamos si está entre los dos anteriores.
-Repetimos el proceso, pero tomando como referencia el segundo punto (hayamos los ángulos del primero y tercero respecto del segundo, y el del punto desconocido, y comprobamos si el punto desconocido está entre los ángulos).

De esta forma, si el punto desconocido está entre dos de los ángulos, está en el triángulo que forman :) No se puede usar un único ángulo, porque no sabemos si está demasiado lejos y, por tanto, fuera de mismo, ni usar una constante de distancia porque no es un radio.

Lo divertido es que se puede usar el mismo método para cualquier figura de 4 lados, usando ángulos opuestos :) Aun no me he puesto a pensar cómo sería en 3D.

No sé por qué he llegado aquí y por qué estoy posteando en un thread tan viejo; pero las mates me pierden :P

Eso que dices que hiciste aquí es lo que haría cualquier hijo de vecino, pero la forma rápida de hacer ese problema (la tuya es bastante lenta porque calcular arcotangentes es lento, se hace por series de Taylor y eso implica iteración); es expresar el cuarto punto como coordenadas baricéntricas de los otros 3 puntos; y luego basta ver si las 3 coordenadas están entre 0 y 1 (está dentro). Si alguna es mayor que 1 o negativa (si una es mayor que 1, al menos otra será negativa) entonces está fuera.

Pasar de coordenadas afines (las que te dan) a baricéntricas es muy rápido, es un sistema de ecuaciones lineales.

Coordenadas baricéntricas:

http://es.wikipedia.org/wiki/Coordenadas_baric%C3%A9ntricas_%28n-simplex%29

Como podéis ver en el artículo, esto te sirve para ver si un punto está dentro de un triángulo, pero también un tetraedro o la generalización a cualquier dimensión de estas figuras, un n-símplice (el poli-n-edro con menor número de vértices en cada dimensión; siempre n+1 vértices).

Drumpi

Wow.
Con razón no me cogieron en aquel trabajo :D
En realidad no conocía este método, así que difícilmente lo podía aplicar. Entiendo el concepto, al menos la parte algebraica (o sea, que entiendo lo que dice la wiki, por chino que parezca :D), pero no termino de ver la representación mental del mismo (tal como me lo imagino, esos valores corresponden a las distancias entre el punto de origen y el centro de la línea que une los otros dos puntos ¿no?).

Mi idea era que, dado que el cálculo de Senos y Cosenos se hace en base a tablas prefabricadas, el arcotangente iba por el mismo camino. Tampoco tenía tanto tiempo como para ponerme a investigar acerca del tema :D

Pero bueno, ya que sale esta solución, la tendré en cuenta para futuros usos :) Como sabeis: triángulos everywhere!
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

peterpollito

Un kitkat porfavor que se me nubla el cerebelo...como me ponga yo a explicar lo que entiendo por senos creo que me expulsan del foro. :P

KeoH

Quote from: peterpollito on November 07, 2011, 12:15:38 AM
Un kitkat porfavor que se me nubla el cerebelo...como me ponga yo a explicar lo que entiendo por senos creo que me expulsan del foro. :P

Lo que tu entiendes por senos es seguramente, mucho mas divertido de manejar xDDD

laghengar

Quote from: Drumpi on December 23, 2010, 02:31:15 PM
Lo resolví de una forma tan sencilla que me asombré yo mismo:
-Usando la arcotangente averiguamos el ángulo respecto del primer punto del segundo y del tercero.
-Por el mismo método, hayamos el ángulo del punto desconocido respecto al primer punto, y comprobamos si está entre los dos anteriores.
-Repetimos el proceso, pero tomando como referencia el segundo punto (hayamos los ángulos del primero y tercero respecto del segundo, y el del punto desconocido, y comprobamos si el punto desconocido está entre los ángulos).

De esta forma, si el punto desconocido está entre dos de los ángulos, está en el triángulo que forman :) No se puede usar un único ángulo, porque no sabemos si está demasiado lejos y, por tanto, fuera de mismo, ni usar una constante de distancia porque no es un radio.

Lo divertido es que se puede usar el mismo método para cualquier figura de 4 lados, usando ángulos opuestos :) Aun no me he puesto a pensar cómo sería en 3D.

Fíjate como son las cosas, lo mismo estoy en la misma situación y hago lo mismo. Pero me he dado cuenta de que no te hace falta para nada averiguar el ángulo. Simplemente con ver que:

- dy/dx de la recta p1-P debe ser un valor comprendido entre dy/dx de las rectas p1-p2 y p1-p3.
- Y dy/dx p2-P entre los valores dy/dx de las rectas p2-p1 y p2-p3.

Me parece que con esto es suficiente. Un saludo.

Maldita sea, por escribir rápido he cometido un error tonto y ya he tenido que editar. :@

Agarrate que vienen curvas. Del mensaje de hackzjuan me he tirado un rato resolviendo este sistema de ecuaciones:

Suponiendo que T, U y V son alfa, beta y gamma respectivamente.

Px = T*p1x + U*p2x + V*p3x
Py = T*p1y + U*p2y + V*p3y
1 = T + U + V

Obtengo que:

T = (Px*(p2y-p3y) -Py*(p2x-p3x) +p2x*p3y +p3x*(p2y- 2*p3y) ) / ( p1x*(p2y-p3y) -p2x*(p1y-p3y) -p3x(p2y-p1y))

U =  (Py -T*(p1y-p3y) +p3y) / (p2y -p3y)

V = 1 -T -U

Siguiendo una ecuación trás otra se hayan alfa, beta y gamma, comprobando después de cada una que T, U, y V estén entre los valores de 0 y 1. Si alguna se sale de ese intervalo el punto no pertenece al triángulo.

Hago un llamamiento XD, por favor que alguien compruebe que esto es verdad para guardarlo y tenerlo para la posteridad.

Llamamiento 2 XD: y si es posible, reducir estas ecuaciones para que sean más sencillas (la ecuación para T se las trae XD).

Un saludo.
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O