我目前正在找到具有12个顶点的特定形状内的坐标。

          (3,7)  (5,7)
            #######
            #     #
            #  X  #
       (3,5)#     #(5,5)
 (1,5)#######  X  #######(7,5)
      #                 #
      #  X  X  X  X  X  #
      #                 #
 (1,3)#######  X  #######(7,3)
       (3,3)#     #(5,3)
            #  X  #
            #     #
            #######
          (3,1)  (5,1)

我想找出形状内部的坐标(标记为“X”),但不包括构成该形状的坐标。

我已经尝试了W. Randolph Franklin(http://www.ecse.rpi.edu/~wrf/Research/Short_Notes/pnpoly.html)进行的pnpoly,但是它也认为构成该形状的坐标为“该形状内部”。

请注意,以上形状仅是示例。坐标可以在任何地方。

如何修改代码,使其不允许包含形状的边界?
int pnpoly(int vertx[], int verty[], int testx, int testy) {
    int nvert = 12;
    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 vertx[],这是一个危险的谎言。等效的显而易见的代码是int* vertx,这很明显它缺少const

关于c++ - 多边形内的点(不包括边界),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16422101/

10-11 00:32