【问题标题】:Point in polygon - faulty algorithm多边形中的点 - 错误的算法
【发布时间】: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


【解决方案1】:

你的多边形是自相交的。 (5,4) 是“外部”是正常的

我认为你认为你的多边形是一个正方形,即使是自相交的多边形,算法也能完美运行。

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 2012-07-27
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多