判斷點是否在多邊形中 射線判斷法

2021-06-02 02:37:26 字數 2904 閱讀 6508

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再多邊形內部。

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

詳解:

1.         已知點point(x,y)和多邊形polygon(x1,y1;x2,y2;….xn,yn;);

2.         以point為起點,以無窮遠為終點作平行於x軸的直線line(x,y; -∞,y);

3.迴圈取得(for(i=0;i多邊形的每一條邊side(xi,yi;xi+1,yi+1),且判斷是否平行於x軸,如果平行continue,否則,i++;

4.         同時判斷point(x,y)是否在side上,如果是,則返回1(點在多邊形

上),否則繼續下面的判斷;

5.         判斷線sideline是否有交點,如果有則count++,否則,i++。

6.         判斷交點的總數,如果為奇數則返回0(點在多邊形內),偶數則返回2(點在多邊形外)。

**:

/* 射線法判斷點q與多邊形polygon的位置關係,要求polygon為簡單多邊形,頂點逆時針排列

如果點在多邊形內: 返回0

如果點在多邊形邊上: 返回1

如果點在多邊形外: 返回2

*/const double infinity = 1e10;

const double esp = 1e-5;

const int max_n = 1000;

struct point ;

struct linesegment ;

typedef vectorpolygon;

// 計算叉乘 |p0p1| × |p0p2|

double multiply(point p1, point p2, point p0)

// 判斷線段是否包含點point

bool isonline(point point, linesegment line)

// 判斷線段相交

bool intersect(linesegment l1, linesegment l2)

// 判斷點在多邊形內

bool inpolygon(const polygon& polygon, point point)

// 如果side平行x軸則不作考慮

if( fabs(side.pt1.y - side.pt2.y) < esp )

if( isonline(side.pt1, line) ) else if( isonline(side.pt2, line) ) else if( intersect(line, side) ) }

if ( count % 2 == 1 )

else

} }

用射線法實現判斷點是否在多邊形內部

最近工作中遇到了這個問題,檢索之後發現這種實現方式挺有意思的,無論是凸多邊形還是凹多邊形都可以判斷。射線法是用被測點向任意方向 通常為了好算,使其射向右側 做一條射線,判斷射線與多邊形的交點。如果交點的數量為奇數,則被測點在多邊形內 如果交點的數量為偶數,則被測點在多邊形以外。期間,有些特殊情況需要...

判斷點是否在多邊形中

一 基本知識 以該點為起點,做平行於x軸的,向x軸的正方向的射線,計算該射線與多邊形的邊相交的次數,如果是奇數則在多邊形的裡面,否則反之。然後需要考慮邊界問題 1 如果點在多邊形的邊上則認為是多邊形裡面,這條在實際應用中可忽略,因為在圖形上多邊形的邊是乙個畫素寬度的,很難點到那裡,2 射線和多邊形的...

python3射線法判斷點是否在多邊形內

usr bin python3.4 coding utf 8 def ispointinpolygon point,rangelist 0,0 1,1 0,1 0,0 1,0.8 判斷是否在外包矩形內,如果不在,直接返回false lnglist latlist for i in range len...