我必须找到多边形中的所有内部点。我使用以下函数来检查每个点(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;
}
答案 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?