TL;DR

How the triangle’s area should be really calculated.

In Area of a triangle I described a way to calculate the area of a triangle with a formula that I “derived myself” - in the sense that I wanted to solve that problem and used my past maths knowledge. This is what I ended up with:

\[S = \frac{ \sqrt{ (\vec{v}\cdot\vec{v})\cdot(\vec{w}\cdot\vec{w}) - (\vec{v}\cdot\vec{w})\cdot(\vec{v}\cdot\vec{w}) } }{2}\]

It turns out that the world consistently beats (most of) us, so I found Area of Triangles and Polygons that provides this instead:

\[S' = \frac{v_x \cdot w_y - v_y \cdot w_x}{2} \\ S = |S'|\]

This is so amazing and superior:

  • no square roots, how cool can that be?
  • the result is signed, which gives us an idea of whether $\vec{v}$ is on the “right” or the “left” of $\vec{w}$, which might come handy.

Awesome! So… code time again (I also played a bit with the inputs to cut one line out):

sub triangle_area {
    my ($v_x, $v_y) = ($_[1][0] - $_[0][0], $_[1][1] - $_[0][1]);
    my ($w_x, $w_y) = ($_[2][0] - $_[0][0], $_[2][1] - $_[0][1]);
    return ($v_x * $w_y - $v_y * $w_x) / 2;
}