不規則多邊形相交切割邏輯

2021-09-13 10:34:37 字數 896 閱讀 6358

之前基本上遇到的多邊形切割問題都是凸多邊形問題,而針對凹多邊形的切割問題卻很少。偶然發現乙個做得特別棒的滑動切割的遊戲,遊戲中主要是使用多邊形切割以及多邊形碰撞演算法。針對多邊形切割的實現做了一下研究,現在把實現跟大家分享一下。

給定任意乙個多邊形以及一條線段,如果多邊形被線段切割,計算切割後產生的多個多邊形。實現的演算法思想如下:

1、求多邊形每一條邊跟線段的交點,將交點插入多邊形的頂點序列,得到新的頂點序列。

2、如果交點超過乙個,多邊形就有可能被切割。

3、先判斷從第乙個交點開始,線段是處於多邊形內部還是多邊形外部,找出距離交點最近的另乙個交點,

如果另乙個交點是最後乙個交點並且這兩個交點連線的中點在多邊形外,那麼當前交點之後線段開始處於多邊形內

如果另乙個交點是最後乙個交點並且這兩個交點連線的中點在多邊內部,那麼當前交點之後線段開始處於多邊形外部

如果另乙個交點當前交點的下乙個交點並且這兩個交點連線的中點在多邊內部,那麼當前交點之後線段開始處於多邊形內部

如果另乙個交點當前交點的下乙個交點並且這兩個交點連線的中點在多邊外部,那麼當前交點之後線段開始處於多邊形外部

4、從第乙個交點開始對新的頂點序列中的點開始拆分,如果多邊形被切割了,那麼當前交點一定是分割之後兩個多邊形的交點,在遇到下乙個交點之前,原來多邊形的頂點需要根據當前線段的狀態來處理,如果當前線段處於多邊形內部,這些點會被分割給新的多邊形,如果線段在多邊形外部,那麼這些點還屬於原多邊形。

5、遇到新的交點,根據線段的狀態來判斷,如果線段之前是處於多邊形內部,那麼當前交點個前乙個交點的連線將原多邊形分割得到了新的多邊形,並且接下來線段的狀態會發生變化,線段開始處於多邊形外部。如果線段之前處於多邊形外部,那麼從當前交點開始,線段開始處於多邊形內部,當前交點和下乙個交點將會分割元多邊形,產生新的多邊形。

演算法使用typescript實現如下:

多邊形相交面積計算模版

型別 多邊形相交面積模板 include include include include includeusing namespace std define maxn 510 const double eps 1e 8 int sig double d struct point point doub...

空間中任意多邊形相交演算法

public static string mypf function 不相交條件 if a 0 a 1 0 a 0 a 2 0 a 0 a 3 0 共面 if math.abs a 0 0.00000000000001 math.abs a 1 0.00000000000001 math.abs a...

射線與三角型 多邊形相交測試

乙個點是否在多邊形裡面,只將這個點向任意方向作乙個射線,若與這條射線有奇數條邊相交則點在多邊形裡面,如果有偶數條邊相交則在外面 實際上兩個三角形合在一起,是乙個四邊形,對於這種多個圖形合在一起的圖形不要做公共邊的測試就行了,把他當成乙個多邊形 或者兩個三角形分開來測試也行。gameres論壇上的co...