判斷點是否處於多邊形內的三種方法

2021-06-08 06:18:15 字數 1979 閱讀 4612

1. 叉乘判別法(只適用於凸多邊形)

想象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊形頂點究竟是左手序還是右手序,這對具體判斷方式有影響。

2. 面積判別法(只適用於凸多邊形)

第四點分別與三角形的兩個點組成的面積分別設為s1,s2,s3,只要s1+s2+s3>原來的三角形面積就不在三角形範圍中.可以使用海**式 。推廣一下是否可以得到面向凸多邊形的演算法?(不確定)

3. 角度和判別法(適用於任意多邊形)

double angle = 0;

realpointlist::iterator iter1 = points.begin();

for (realpointlist::iterator iter2 = (iter1 + 1); iter2 < points.end(); ++iter1, ++iter2)

if (fabs(angle - span::pi2) < 0.01) return true;

else return false;

另外,可以使用bounding box來加速。

if (p.x < (*iter)->boundingbox.left ||

p.x > (*iter)->boundingbox.right ||

p.y < (*iter)->boundingbox.bottom ||

p.y > (*iter)->boundingbox.top) 。。。。。。

對於多邊形來說,計算bounding box非常的簡單。只需要把水平和垂直方向上的最大最小值找出來就可以了。

對於三角形:第四點分別與三角形的兩個點的交線組成的角度分別設為j1,j2,j3,只要j1+j2+j3>360就不在三角形範圍中。

4. 水平/垂直交叉點數判別法(適用於任意多邊形)

注意到如果從p作水平向左的射線的話,如果p在多邊形內部,那麼這條射線與多邊形的交點必為奇數,如果p在多邊形外部,則交點個數必為偶數(0也在內)。所以,我們可以順序考慮多邊形的每條邊,求出交點的總個數。還有一些特殊情況要考慮。假如考慮邊(p1,p2),

1)如果射線正好穿過p1或者p2,那麼這個交點會被算作2次,處理辦法是如果p的從座標與p1,p2中較小的縱座標相同,則直接忽略這種情況

2)如果射線水平,則射線要麼與其無交點,要麼有無數個,這種情況也直接忽略。

3)如果射線豎直,而p0的橫座標小於p1,p2的橫座標,則必然相交。

4)再判斷相交之前,先判斷p是否在邊(p1,p2)的上面,如果在,則直接得出結論:p再多邊形內部。

判斷點與多邊形的關係(在平面上),不能用簡單的向量叉乘來判斷,特別是在有凹邊形的情況下,下面和大家分享乙個判斷點是否在多邊形範圍內的簡單演算法。在進行判斷前,建議先進行範圍大致判斷,在許多情況下,應該說大部分情況下,我們進行判斷的物件在空間上相差可能很遠,如果一開始就直接用演算法去計算,這樣會浪費大量的計算時間和空間,所以在使用具體演算法前,先進行乙個大致範圍的判斷。先判斷它是否有可能在這個區域,如果不可能就直接out,如果有可能,再用演算法去計算具體是否在範圍內。和後面的演算法相比,前面的比較過程所消耗的時間可以說是微不足道,但是用這個微不足道的時間卻可以極大提高演算法的執行效率。廢話不多說了,直接上演算法!用靜態方法寫的,可以直接呼叫,該演算法也適合凹邊形的情況。

///

/// 判斷點是否在多邊形的範圍內

/// 返回值:值為1表示點在多邊形範圍內;

/// 值為0表示點在多邊形邊上;

/// 值為-1表示點不在多邊形範圍內。

///

/// 點座標,長度為2

/// 多邊形節點座標,長度為2*n,其中n應大於或等於3,即至少為三角形

///

/// 返回值:值為1表示點在多邊形範圍內;

/// 值為0表示點在多邊形邊上;

/// 值為-1表示點不在多邊形範圍內。

///

判斷點是否處於多邊形內的三種方法

1.叉乘判別法 只適用於凸多邊形 想 象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將 該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊...

判斷點是否在多邊形內

1.叉乘判別法 只適用於凸多邊形 想象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊形頂...

判斷點是否在多邊形內

判斷點是否在多邊形內有三個步驟 自csdn 第一步 判斷這個點是不是就是多邊形的端點 第二步 判斷這個點是不是落在多邊形的邊界上 第三步 通過這個點橫向作一平行射線,判斷與多邊形的交點數,如果交點是頂點,則交點數加一,結果如果是奇數,則該點落在多邊形之內,如果是偶數,則反之。具體演算法涉及向量叉積,...