1. 程式人生 > >判斷點是否在凸多邊形內

判斷點是否在凸多邊形內

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

以下圖為例說明問題:

 

原則:

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; }

親測有效。