判斷點是否在凸多邊形內


判斷點是否在凸多邊形內的方法很多,此處僅給出使用向量叉積判斷點是否在凸多邊形內的方法。

以下圖為例說明問題:

 

原則:

1. 將多邊形的第i條邊的第一個頂點指向點P得到向量 v1,然后將從第一個頂點指向第二個頂點得到向量v2,叉乘這兩個向量。

2.如果叉乘結果與上一條邊的叉乘結果的乘積大於0則繼續執行,如果乘積小於0,表示點P不在凸多邊形內,直接返回即可。

 

要點:要求凸多邊形的點以固定的順序給出,例如固定為逆時針或順時針。

 

實現的代碼如下:

struct Point
{
    float x;
    float y;
    Point() :x(0), y(0){}
};
Point SubPoint(
const Point& vTarget1, const Point& vTarget2) { Point vPoint; vPoint.x = vTarget1.x - vTarget2.x; vPoint.y = vTarget1.y - vTarget2.y; return vPoint; } float CrossProduct(const Point& vTarget1, const Point& vTarget2) { return vTarget1.x * vTarget2.y - vTarget2.x * vTarget1.y; } bool IsPointInConvexPolygon(const vector<Point>& aPoints, const Point& vTarget) { if (aPoints.size() == 0) return false; float nCurCrossProduct = 0, nLastValue = 0; for (int i = 0; i < aPoints.size(); i++) { Point vU = SubPoint(vTarget, aPoints[i]); int nNextIndex = (i + 1) % aPoints.size(); Point vV = SubPoint(aPoints[nNextIndex], aPoints[i]); nCurCrossProduct = CrossProduct(vU, vV); if (i > 0 && nCurCrossProduct * nLastValue <= 0) { return false; } nLastValue = nCurCrossProduct; } return true; }

親測有效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM