算法描述
——-代码实现
/// <summary>
/// 判断P是否在以P1,P2为对角顶点的矩形内。
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <param name="p"></param>
/// <returns></returns>
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;
}
/// <summary>
/// (P1-P) * (P2 - P) = 0;判断三线共线
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <param name="p"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 判断点p是否在以p1,p2的线段上。
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <param name="p"></param>
/// <returns></returns>
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;
}
参考资料:地理信息系统算法基础_张宏 p23