皇冠现金app判断二个坐标是或不是在多方形内部是个平常要遇见的标题,判断一个坐标是还是不是在大举形内部是个日常要相遇的题材

转自http://blog.sina.com.cn/s/blog\_73000beb0101d4m0.html

转自http://blog.sina.com.cn/s/blog\_73000beb0101d4m0.html

在GIS(地理音讯保管连串)中,判断八个坐标是还是不是在多边形内部是个常常要赶上的标题。乍听起来还挺复杂。依据W.
Randolph Franklin 建议的PNPoly算法,只需区区几行代码就化解了那个题材。

在GIS(地理音信保管种类)中,判断二个坐标是还是不是在多边形内部是个日常要相遇的标题。乍听起来还挺复杂。依照W.
Randolph Franklin 建议的PNPoly算法,只需区区几行代码就消除了那么些题材。

假定多边形的坐标存放在1个数组里,首先大家须要获得该数组在横坐标和纵坐标的最大值和微小值,依据那多个点算出1个四边型,首先判断指标坐标点是还是不是在这么些四边型之内,假使在这几个四边型之外,这能够跳过前边较为复杂的推断,直接再次来到false。

若是多边形的坐标存放在1个数组里,首先大家供给获得该数组在横坐标和纵坐标的最大值和纤维值,遵照那多个点算出1个四边型,首先判断指标坐标点是或不是在那些四边型之内,如若在那么些四边型之外,那能够跳过前面较为复杂的盘算,直接再次来到false。

if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) { 
     // 这个测试都过不了。。。直接返回false;
}
if (p.x < minX || p.x > maxX || p.y < minY || p.y > maxY) { 
     // 这个测试都过不了。。。直接返回false;
}

接下去是着力算法部分:

皇冠现金app,接下去是核心算法部分:

int pnpoly (int nvert, float *vertx, float *verty, float testx, float
testy) {

int pnpoly (int nvert, float *vertx, float *verty, float testx, float
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; 
}

额,代码就这么简单,但到底啥意思呢:

首先,参数nvert 代表多边形有几个点。浮点数testx, testy代表待测试点的横坐标和纵坐标,*vertx,*verty分别指向储存多边形横纵坐标数组的首地址。
    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; 
}

额,代码就这么简单,但到底啥意思呢:

首先,参数nvert 代表多边形有几个点。浮点数testx, testy代表待测试点的横坐标和纵坐标,*vertx,*verty分别指向储存多边形横纵坐标数组的首地址。

大家注意到,每趟计算都提到到隔壁的四个点和待测试点,然后考虑多个难题:

我们注意到,每一趟总计都关乎到相邻的八个点和待测试点,然后考虑多个难点:

1.
被测试点的纵坐标testy是或不是在本次循环所测试的八个相邻点纵坐标范围以内?即

1.
被测试点的纵坐标testy是还是不是在本次循环所测试的三个相邻点纵坐标范围以内?即

verty[i] <testy < verty[j]

verty[i] <testy < verty[j]

或者

或者

verty[j] <testy < verty[i]

verty[j] <testy < verty[i]

  1. 待测点test是不是在i,j两点之间的连线之下?看不懂后半短if
    statement的朋友请自行在纸上写下i,j两点间的斜率公式,要用到一点初级中学解析几何和不等式的知识范畴,对常见码农来说小菜一碟。
  1. 待测点test是或不是在i,j两点之间的连线之下?看不懂后半短if
    statement的对象请自行在纸上写下i,j两点间的斜率公式,要用到一些初级中学解析几何和不等式的学识范畴,对普遍码农来说小菜一碟。

下一场每一次那四个规范还要知足的时候我们把重返的布尔量取反。

接下来每一趟那多少个标准化还要满意的时候大家把再次来到的布尔量取反。

可这毕竟是啥意思啊?

可那毕竟是啥意思啊?

以此表明式的意思是说,随便画个多边形,随便定三个点,然后通过那一个点水平划一条线,先数数看这条横线和绝大多数形的边相交四遍,(或许说先祛除那多少个不相交的边,第②个度量圭表),然后再数那条横线穿越多边形的次数是还是不是为奇数,要是是奇数,那么该点在多方面形内,假使是偶数,则在多边形外。详细的数学注明那里就不做了,不过读者能够自动画多边形进行求证。

本条表明式的情趣是说,随便画个多边形,随便定2个点,然后通过这一个点水平划一条线,先数数看那条横线和五头形的边相交五回,(恐怕说先去掉那多少个不相交的边,第三个测量圭臬),然后再数那条横线穿更加多边形的次数是或不是为奇数,借使是奇数,那么该点在大举形内,尽管是偶数,则在多方面形外。详细的数学申明那里就不做了,然则读者能够活动画多边形举行表达。

 

 

相关文章