Skip to Content

Área orientada de un triángulo

Dados tres puntos p1p_1, p2p_2 y p3p_3, calcular un área orientada (con signo) de un triángulo formado por ellos. El signo del área se determina de la siguiente manera: imagínese que uno está de pie en el plano en el punto p1p_1 y mira hacia p2p_2. Se va a p2p_2 y si p3p_3 queda a la derecha (entonces decimos que los tres vectores giran en sentido “horario”), el signo del área es negativo; en caso contrario es positivo. Si los tres puntos son colineales, el área es cero.

Usando esta área con signo, podemos tanto obtener el área usual sin signo (como el valor absoluto del área con signo) como determinar si los puntos yacen en sentido horario o antihorario en el orden especificado (lo cual es útil, por ejemplo, en algoritmos de envolvente convexa).

Cálculo

Podemos usar el hecho de que el determinante de una matriz 2×22\times 2 es igual al área con signo de un paralelogramo generado por los vectores columna (o fila) de la matriz. Esto es análogo a la definición del producto cruz en 2D (véase Geometría básica). Al dividir esta área por dos obtenemos el área del triángulo que nos interesa. Usaremos p1p2\vec{p_1p_2} y p2p3\vec{p_2p_3} como vectores columna y calcularemos un determinante 2×22\times 2:

2S=x2x1x3x2y2y1y3y2=(x2x1)(y3y2)(x3x2)(y2y1)2S=\left|x2x1amp;x3x2y2y1amp;y3y2\begin{matrix}x_2-x_1 & x_3-x_2\y_2-y_1 & y_3-y_2\end{matrix}\right|=(x_2-x_1)(y_3-y_2)-(x_3-x_2)(y_2-y_1)

Implementación

int signed_area_parallelogram(point2d p1, point2d p2, point2d p3) { return cross(p2 - p1, p3 - p2); } double triangle_area(point2d p1, point2d p2, point2d p3) { return abs(signed_area_parallelogram(p1, p2, p3)) / 2.0; } bool clockwise(point2d p1, point2d p2, point2d p3) { return signed_area_parallelogram(p1, p2, p3) < 0; } bool counter_clockwise(point2d p1, point2d p2, point2d p3) { return signed_area_parallelogram(p1, p2, p3) > 0; }

Problemas de práctica