凸多邊形考慮叉積,因為在凸多邊形中,我們假設圍繞多邊形走一圈,如果點在多邊形內,那麼這個點一直在我們的同一側。按照這個性質,我們順時針或者逆時針處理多邊形上的點,叉積運算,算參考的和多邊形上連續的兩個點,如何叉積的結果符號發生變化,那麼不再多邊形內。
double det(point p1,point p2,point p0)
bool isinside(point p)
}pre=now;
}return true;
}
凹多邊形不滿足上面的性質,使用不能使用。計算機圖形學中講授過射線與多邊形的交點個數,如果為偶數,則不再多邊形內,否則在多邊形內。射線與多邊形變重合不考慮,與頂點相交特殊考慮,不考慮或者算乙個。
這裡我們作一條水平向右的射線。
首先,對於多邊形的水平邊不做考慮,其次,對於多邊形的頂點和射線相交的情況,如果該頂點是其所屬的邊上縱座標較大的頂點,則計數,否則忽略該點。最後,對於q在多邊形上的情形,直接判斷q是否屬於多邊形。
點積和叉積判斷點在直線上,運用叉積判斷點在多邊形的哪一側,這樣判斷和交點奇偶數等效,這樣寫較為減掉,寫的時候最後手動模擬一下,驗證正確性。
ll operator^(node p1, node p2)
double det(node a, node b, node c)
bool onseg(node p, node l1, node l2)
//poly點順或者逆時針
bool pointinpolygon(node p, vectorpoly)
if (cnt != 0)return true;
return false;
}
判斷點在多邊形內演算法
點和多邊形關係的演算法實現 好了,現在我們已經了解了向量叉積的意義,以及判斷直線段是否有交點的演算法,現在回過頭看看文章開始部分的討論的問題 如何判斷乙個點是否在多邊形內部?根據射線法的描述,其核心是求解從p點發出的射線與多邊形的邊是否有交點。注意,這裡說的是射線,而我們前面討論的都是線段,好像不適...
點在多邊形內的判斷(射線法)
射線法,顧名思義,就是用射線去判斷點是否在多邊形內。射線從哪來呢?在這裡先設要判斷的點為p x,y 多邊形構成的點用乙個 v maxn x,y 陣列儲存 其中maxn是該多邊形的頂點數 射線是從p x,y 開始,水平向右 平行於 x 軸 引出,當然,這條射線只是虛擬的,想象出來就行了。射線引出來後有...
點在多邊形內外的判斷
點與多邊形的的位置關係 點在形內 點在形外 點在邊界上 判斷方法 射線法 轉角法 射線法 通常取x軸正方向為射線方向 奇數次相交,則在形內 偶數次相交,則在形外 對於凹多邊形也是可以的 射線法的特殊情況 與定點相交 與其相鄰的端點或者線段在射線的異側,則認為是相交 否則不認為相交 與邊部分重合 縮點...