原理:设点为Q,线段为P1P2,判断点Q在线段上的依据是:(Q-P1)×(P2-P1)=0,且Q在以P1P2为对角定点的矩形内。前者保证Q点在直线上,后者保证Q点不在线段的延长线或反向延长线上,这一步骤其实就是分别判断一下Q点的x、y坐标是否在P1、P2点的x、y坐标之间;
代码:
// 判断P是否在以P1,P2为对角顶点的矩形内。
public static bool IsOnRectangle(Point p1, Point p2, Point p)
{
double max_x = p1.X > p2.X ? p1.X : p2.X;
double min_x = p1.X < p2.X ? p1.X : p2.X;
double max_y = p1.Y > p2.Y ? p1.Y : p2.Y;
double min_y = p1.Y < p2.Y ? p1.Y : p2.Y;
if (p.X >= min_x && p.X <= max_x && p.Y >= min_y && p.Y <= max_y)
return true;
else
return false;
}
// (P1-P) * (P2 - P) = 0;判断三线共线
public static bool IsDirection(Point p1, Point p2, Point p)
{
double result = (p1.X - p.X) * (p2.Y - p.Y) - (p2.X - p.X) * (p1.Y - p.Y);
if (result == 0)
return true;
return false;
}
// 判断点p是否在以p1,p2的线段上。
public static bool IsOnSegment(Point p1, Point p2, Point p)
{
if (IsDirection(p1, p2, p))
{
if (IsOnRectangle(p1, p2, p))
{
return true;
}
else
return false;
}
else
return false;
}