#!/usr/bin/perl -w
use strict;
sub X() { 0 }
sub Y() { 1 }
# Given a line segment from point A to point B:
my @A= splice @ARGV, 0, 2;
my @B= splice @ARGV, 0, 2;
# And another point P:
my @P= splice @ARGV, 0, 2;
# Translate point A to be the origin of the
# plane (subtract A from the other points):
my @B1= ( $B[X]-$A[X], $B[Y]-$A[Y] );
my @P1= ( $P[X]-$A[X], $P[Y]-$A[Y] );
# Rotate the plane so B is on the X axis:
# (Also expands the plane by a factor
# equal to the length of the line segment)
@P1= ( $P1[X]*$B1[X] + $P1[Y]*$B1[Y],
$P1[Y]*$B1[X] - $P1[X]*$B1[Y] );
@B1= ( $B1[X]*$B1[X] + $B1[Y]*$B1[Y], 0 );
# You can now find the closest point on the line:
# (let $t=0 represent A and $t=1 represent B)
my $t= $P1[X]/$B1[X];
my @I= ( (1-$t)*$A[X] + $t*$B[X],
(1-$t)*$A[Y] + $t*$B[Y] );
# And/or, find the length of the line segment
# and the distance from the point to the line:
my $len= sqrt( $B1[X] );
# Add abs() if you don't want to know
# which side of the line the point is on:
my $dist= $P1[Y]/$len;
# Might as well compute the area of our triangle:
my $area= $len*abs($dist)/2;
print "I=( $I[X], $I[Y] ) t=$t\n";
print "dist=$dist len=$len area=$area\n";