给定多边形的坐标, 我找到了许多算法来检测点是否在多边形中 - 例如:[1]和[2]。但是这些算法都不能检测点是否位于此多边形的顶点上。例如,我有一个多边形:
|---------------------|
| |
| |
|---------------------|
我的观点是在右上角。我想要一个算法,告诉我该点是否在多边形内。我怎么能这样做?
答案 0 :(得分:1)
除了处理与浮点不完全匹配但足够接近相关的问题之外,相同的算法应该适用于两者。
只需在多边形内部选取一个点,创建从测试点到内部点的测试线段,然后,对于多边形中的每个线段,确定测试线段是否与该多边形线相交,要计为相交,计数相交在多边形线段的一端打开,在另一端关闭,即如果交点与多边形的起点完全相同,则计算它,但如果它与终点完全相同,则不计算它。您需要这样做,以便当测试段与多边形顶点相交时,您只能将其计数为与顶点两侧的两个段中的一个相交。
然后如果测试点在多边形内部,交叉点的数量将是偶数,如果它在外面,它将是一个奇数。
答案 1 :(得分:0)
刚刚在这里找到了解决方案。它非常简单,[1]的代码已经实现了a
和b
。可以在here找到源代码的其他信息。
const float EPSILON = 0.001f;
bool IsPointOnLine(Point linePointA, Point linePointB, Point point)
{
float a = (linePointB.y - linePointA.y) / (linePointB.x - linePointB.x);
float b = linePointA.y - a * linePointA.x;
if ( fabs(point.y - (a*point.x+b)) < EPSILON)
{
return true;
}
return false;
}