private static Point2D FindPointOnLineClosestToPoint(Point2D p0 , Point2D p1 , Point2D p)
{
Point2D p0p = new Point2D(p.X - p0.X , p.Y - p0.Y);
Point2D p1p = new Point2D(p1.X - p0.X , p1.Y - p0.Y);
double p0p1sq = p1p.X * p1p.X + p1p.Y * p1p.Y;
double p0p_p0p1 = p0p.X * p1p.X + p0p.Y * p1p.Y;
double t = p0p_p0p1 / p0p1sq;
if (t < 0.0)
{
t = 0.0;
}
else if (t > 1.0)
{
t = 1.0;
}
return new Point2D(p0.X + p1p.X * t , p0.Y + p1p.Y * t);
}