判斷乙個座標點是否在不規則多邊形內部的演算法

2022-03-29 03:37:29 字數 1266 閱讀 9418

在gis(地理資訊管理系統)中,判斷乙個座標是否在多邊形內部是個經常要遇到的問題。乍聽起來還挺複雜。根據w. randolph franklin 提出的pnpoly演算法,只需區區幾行**就解決了這個問題。

假設多邊形的座標存放在乙個陣列裡,首先我們需要取得該陣列在橫座標和縱座標的最大值和最小值,根據這四個點算出乙個四邊型,首先判斷目標座標點是否在這個四邊型之內,如果在這個四邊型之外,那可以跳過後面較為複雜的計算,直接返回false。

if (p.x < minx || p.x > maxx || p.y < miny || p.y > maxy) {

// 這個測試都過不了。。。直接返回false;

接下來是核心演算法部分:

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分別指向儲存多邊形橫縱座標陣列的首位址。

我們注意到,每次計算都涉及到相鄰的兩個點和待測試點,然後考慮兩個問題:

1. 被測試點的縱座標testy是否在本次迴圈所測試的兩個相鄰點縱座標範圍之內?即

verty[i] 或者

verty[j] 2. 待測點test是否在i,j兩點之間的連線之下?看不懂後半短if statement的朋友請自行在紙上寫下i,j兩點間的斜率公式,要用到一點初中解析幾何和不等式的知識範疇,對廣大碼農來說小菜一碟。

然後每次這兩個條件同時滿足的時候我們把返回的布林量取反。

可這到底是啥意思啊?

這個表示式的意思是說,隨便畫個多邊形,隨便定乙個點,然後通過這個點水平劃一條線,先數數看這條橫線和多邊形的邊相交幾次,(或者說先排除那些不相交的邊,第乙個判斷條件),然後再數這條橫線穿越多邊形的次數是否為奇數,如果是奇數,那麼該點在多邊形內,如果是偶數,則在多邊形外。詳細的數學證明這裡就不做了,不過讀者可以自行畫多邊形進行驗證。

判斷乙個座標點是否在不規則多邊形內部的演算法

參考 1,將多邊形的座標存在在乙個陣列裡,首先我們需要取得該陣列在橫座標和縱座標的最大值和最小值,根據這四個值minx,maxx,miny,maxy,算出乙個四邊形,判斷目標點是否在這個四邊形內,不滿足,直接返回false,證明該目標點不在此多邊形內部。if m pos.x minx m pos.x...

判斷乙個座標點是否在不規則多邊形內部的演算法

在gis 地理資訊管理系統 中,判斷乙個座標是否在多邊形內部是個經常要遇到的問題。乍聽起來還挺複雜。根據w.randolph franklin 提出的pnpoly演算法,只需區區幾行 就解決了這個問題。假設多邊形的座標存放在乙個陣列裡,首先我們需要取得該陣列在橫座標和縱座標的最大值和最小值,根據這四...

判斷乙個點是否在乙個多邊形裡

判斷乙個點是否在乙個多邊形裡 一開始以為是個挺難的問題,但google了一下之後發現其實蠻簡單,所用到的演算法叫做 ray casting algorithm 中文應該叫 光線投射演算法 這是維基百科的描述 維基百科 簡單地說可以這麼判斷 從這個點引出一根 射線 與多邊形的任意若干條邊相交,累計相交...