判斷點是否在多邊形內有三個步驟:**自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穿出了多邊形。可知,...