判斷點是否在凸多邊形內
阿新 • • 發佈:2018-11-20
判斷點是否在凸多邊形內的方法很多,此處僅給出使用向量叉積判斷點是否在凸多邊形內的方法。
以下圖為例說明問題:
原則:
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; }
親測有效。