public float DistanceTo (PointF p3)
{
var x21 = EndX - X;
var y21 = EndY - Y;
var x31 = p3.X - X;
var y31 = p3.Y - Y;
var d = x21*x21 + y21*y21;
if (d <= 0) return (float)Math.Sqrt (x31*x31 + y31*y31);
var n = x31*x21 + y31*y21;
var u = n / d;
if (u <= 0) {
return (float)Math.Sqrt (x31*x31 + y31*y31);
}
else if (u >= 1) {
var x32 = p3.X - EndX;
var y32 = p3.Y - EndY;
return (float)Math.Sqrt (x32*x32 + y32*y32);
}
else {
var dx = X + u*x21 - p3.X;
var dy = Y + u*y21 - p3.Y;
return (float)Math.Sqrt (dx*dx + dy*dy);
}
}