Aprendamos a detectar si un punto está dentro de un triángulo.
Y por qué deberíamos molestarnos en aprender eso?
Detectar colisiones!
Pues resulta que en los Videojuegos modernos todo está formado a partir de triángulos.




Si sabes detectar cuando un punto está dentro de un triángulo podrás determinar cuándo un personaje está chocando contra una pared, el suelo, un enemigo, etc…

Empecemos determinando si un punto P se encuentra dentro del triángulo formado por los vértices ABC.

Podemos definir a P como la suma entre dos vectores: uno naranja, ponderado por w1 y correspondiente al segmento AB; y otro amarillo, ponderado por w2 y correspondiente al segmento AC.


Cuando P se encuentra en el vértice A, w1 = 0 y w2 = 0.

Cuando P se encuentra en el vértice B, w1 = 1 y w2 = 0.

Cuando P se encuentra en el vértice C, w1 = 0 y w2 = 1.
De qué nos sirven w1 y w2?

Fíjate que cuando el punto está bajo el segmento AC, w1 se torna negativa.

Cuando el punto está hacia el otro extremo fuera del segmento AB, w2 se torna negativa.

Y cuando el punto yace más allá del segmento BC, la suma entre w1 y w2 es mayor que 1.
Entonces podemos determinar que el punto P se encuentra dentro del triángulo ABC si se cumplen las siguientes condiciones:
Cómo determinar w1 y w2?
Primero definamos D y E como los siguientes segmentos del triángulo:
Entonces podemos definir al punto P como:
Tenemos una ecuación con dos incógnitas. Para resolverla, expresemos los vectores de manera independiente en sus componentes (x, y):
Quedando un sistema de dos ecuaciones con dos incógnitas que podemos resolver mediante álgebra.
Despejando w2:
Ahora, sustituimos w2 en la ecuación que contiene a Px:
Para despejar w1, dividimos por Ey a ambos lados de la ecuación:
Destruyendo paréntesis queda así:
Agrupando w1:
Despejando w1:
Y con esto obtenemos las dos fórmulas que nos permiten hallar w1 y w2.
Porción de código C# que realiza la comprobación. El proyecto completo de Unity se encuentra en el video.
w1 = (e.x * (a.y - p.y) + e.y * (p.x - a.x)) / (d.x * e.y - d.y * e.x); w2 = (p.y - a.y - w1 * d.y) / e.y; pointInTriangle = (w1 >= 0.0) && (w2 >= 0.0) && ((w1 + w2) <= 1.0); if (pointInTriangle) { //Punto dentro del triángulo } else { //Punto fuera del triángulo }

Qué hacer si ocurre una división por cero?
En el video encontrarás la respuesta!
Nos vemos, PRO!




















