多边形内部点

时间:2012-08-24 15:16:13

标签: c++ c computational-geometry

我必须找到多边形中的所有内部点。我使用以下函数来检查每个点(x,y),但是对于某些点,即使该点在外部或位于多边形的边缘,也会返回true。

bool IsInside(int no_vert,float *vertx, float *verty, float testx, float testy)
{
  int i;
  int j;
  bool c=false;
  for (i = 0, j = no_vert-1; i < no_vert; j = i++) 
  {
      if ( ((verty[i]>testy) != (verty[j]>testy)) && (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
      {
         c = true;
      }
  }
  return c;
}

3 个答案:

答案 0 :(得分:3)

你想做的不是测试

testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i])

但关系保持不变(即始终为<或始终为>)。

这样做的常见方式是(未经过测试,没有特殊情况下的平等)

bool result = true;
bool sign = ((xt-x[n-1])*(y[0]-y[n-1]) < (yt-y[n-1])*(y[0]-y[n-1]));
for (i = 0; result && i < no_vert; i++) 
{
   if (sign != ((xt-x[i])*(y[i]-y[i-1]) < (yt-y[i-1])*(y[i]-y[i-1]))
      result = false;
}
return result;

顺便说一句,这只适用于多边形。

答案 1 :(得分:1)

由于舍入错误,您的问题可能会发生。即使一个点位于多边形的边缘(或非常接近边缘但仍然在外面),确定它是否在内部的方法由于使用有限精度而受到数值误差的影响。换句话说,在这样的测试中得到错误答案是正常的(我建议你阅读浮点运算)。

我建议你不要严重依赖这种类型的精确验证,而是编写代码并开发可以处理这种误报/否定的算法。这种东西在计算几何中无处不在。

编辑:我认为另一个可能的错误是你应该c = !c阻止c = true而不是if。{/ p>

答案 2 :(得分:1)

我不知道你的算法如何在多边形测试中作为一般点。

看看这里的工作算法: How can I determine whether a 2D Point is within a Polygon?

相关问题