确定点是否在多边形的顶点上

时间:2013-07-08 13:37:04

标签: math polygon computational-geometry

给定多边形的坐标, 我找到了许多算法来检测点是否在多边形中 - 例如:[1][2]。但是这些算法都不能检测点是否位于此多边形的顶点上。例如,我有一个多边形:

|---------------------|
|                     |
|                     |
|---------------------|

我的观点是在右上角。我想要一个算法,告诉我该点是否在多边形内。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

除了处理与浮点不完全匹配但足够接近相关的问题之外,相同的算法应该适用于两者。
只需在多边形内部选取一个点,创建从测试点到内部点的测试线段,然后,对于多边形中的每个线段,确定测试线段是否与该多边形线相交,要计为相交,计数相交在多边形线段的一端打开,在另一端关闭,即如果交点与多边形的起点完全相同,则计算它,但如果它与终点完全相同,则不计算它。您需要这样做,以便当测试段与多边形顶点相交时,您只能将其计数为与顶点两侧的两个段中的一个相交。

然后如果测试点在多边形内部,交叉点的数量将是偶数,如果它在外面,它将是一个奇数。

答案 1 :(得分:0)

刚刚在这里找到了解决方案。它非常简单,[1]的代码已经实现了ab。可以在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;
}