判斷點是否在多邊形內

2021-08-25 18:25:04 字數 1246 閱讀 7085

判斷點是否在多邊形內有三個步驟:**自csdn)

第一步:判斷這個點是不是就是多邊形的端點;

第二步:判斷這個點是不是落在多邊形的邊界上;

第三步:通過這個點橫向作一平行射線,判斷與多邊形的交點數,如果交點是頂點,則交點數加一,結果如果是奇數,則該點落在多邊形之內,如果是偶數,則反之。

具體演算法涉及向量叉積,具體這部分不詳細說了,上網輕易查到,下面貼過主演算法函式吧,參考很好用。

還是來自於csdn的。

const double infinity = 1e10;

const double esp = 1e-5;

const int max_n = 1000;

struct point ;

struct linesegment ;

inline double max(double x, double y)

inline double min(double x, double y)

// 計算叉乘 |p1p0| × |p2p0|

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

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

bool isonline(point point, linesegment line)

// 判斷線段相交

bool intersect(linesegment l1, linesegment l2)

// 判斷點在多邊形內

bool inpolygon(point polygon, int n, point point)

else if (n == 2)

int count = 0;

linesegment line;

line.pt1 = point;

line.pt2.y = point.y;

line.pt2.x = - infinity;

for( int i = 0; i < n; i++ )

// 如果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) )

} return ( count % 2 == 1 );

}

判斷點是否在多邊形內

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

判斷點是否在凸多邊形內

判斷點是否在凸多邊形內的方法很多,此處僅給出使用向量叉積判斷點是否在凸多邊形內的方法。以下圖為例說明問題 原則 1.將多邊形的第i條邊的第乙個頂點指向點p得到向量 v1,然後將從第乙個頂點指向第二個頂點得到向量v2,叉乘這兩個向量。2.如果叉乘結果與上一條邊的叉乘結果的乘積大於0則繼續執行,如果乘積...

判斷點及線段是否在多邊形內

昨天小學了一點計算幾何學的內容,想把它記下來,以便以後翻閱。1.判斷點是否在多邊形中 先說一下思路 判斷點 p 是否在多邊形中,可以先以點p向左引一條射線 l 我們知道,從射線l左端的無窮遠處開始一直到點p的過程中,當遇到多邊形的第乙個交點時l進入了多邊形,當遇到第二個交點時,l穿出了多邊形。可知,...