P = (p-1)*A + p*B
####
P = p*A + (1-p)*B
Q = q*C + (1-p)*D
Find p,q such that P=Q:
[ p*ax + (1-p)*bx, p*ay + (1-p)*by ] =
[ q*cx + (1-q)*dx, q*cy + (1-q)*dy ]
p*ax + (1-p)*bx = q*cx + (1-q)*dx
p*ay + (1-p)*by = q*cy + (1-q)*dy
p*(ax-bx) + bx = q*(cx-dx) + dx
p*(ay-by) + by = q*(cy-dy) + dy
( p*(ax-bx) + bx-dx ) / (cx-dx) = q
( p*(ay-by) + by-dy ) / (cy-dy) = q
( p*(ax-bx) + bx-dx ) / (cx-dx)
= ( p*(ay-by) + by-dy ) / (cy-dy)
( p*(ax-bx) + bx-dx ) * (cy-dy)
= ( p*(ay-by) + by-dy ) * (cx-dx)
p*(ax-bx)*(cy-dy) + (bx-dx)*(cy-dy)
= p*(ay-by)*(cx-dx) + (by-dy)*(cx-dx)
p*( (ax-bx)*(cy-dy) - (ay-by)*(cx-dx) )
= (by-dy)*(cx-dx) - (bx-dx)*(cy-dy)
####
p = ( (by-dy)*(cx-dx) - (bx-dx)*(cy-dy) )
/ ( (ax-bx)*(cy-dy) - (ay-by)*(cx-dx) )
px= p*ax + (1-p)*bx
py= p*ay + (1-p)*by
####
sub intersectLines {
my( $ax, $ay, $bx, $by, $cx, $cy, $dx, $dy )= @_;
my $d= ($ax-$bx)*($cy-$dy) - ($ay-$by)*($cx-$dx);
die "Parallel lines" if 0 == $d;
my $p = ( (by-dy)*(cx-dx) - (bx-dx)*(cy-dy) ) / $d;
my $px= $p*$ax + (1-$p)*$bx;
my $py= $p*$ay + (1-$p)*$by;
return( $px, $py );
}