【发布时间】:2015-05-04 18:59:22
【问题描述】:
我有一个算法的 C 代码来检查给定点是否在多边形内。它应该是正确的,我还在各个地方看到这个代码。但是,当我使用它时,它并不能完美运行 - 大约 20% 的答案是错误的。
int pnpoly(int nvert, double *vertx, double *verty, double testx, double testy)
{
int i, j, c = 0;
for (i = 0, j = nvert-1; i < nvert; j = i++) {
if ( ((verty[i]>testy) != (verty[j]>testy)) &&
(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
c = !c;
}
return c;
}
也许我的主要功能有问题。有人可以给我一个主要功能来检查这个算法吗?
这是我的主要功能
int main(){
double vertx[4] = {10, 10, 0, 0};
double verty[4] = {10, 0, 10, 0};
// for those two it returns "Inside"
double testx = 6;
double testy = 4;
/* for those two it returns "Outside"
double testx = 5;
double testy = 4;
*/
int result = pnpoly(4, vertx, verty, testx, testy);
if (result) {
printf("\nInside\n");
}
else {
printf("\nOutside\n");
}
return 0;
}
【问题讨论】:
-
给我们展示一个错误输出的例子。
-
您可能还会发现,使用凸多边形的算法会因凹多边形而失败。
-
您将双精度值传递给定义为接受浮点数的函数,编译器应该警告您。由vertx/verty描述的假定为正方形的图形不是闭合路径。这可能会在您给出不一致的答案的令人惊讶的复杂比较中发挥作用。
-
我把它改成了双倍,同样的事情发生了。 Erik,你认为我应该添加第 5 点 (10,10) 来关闭路径吗?
标签: c polygon point point-in-polygon