寒江雪 凸多邊形矩形裁切演算法

2021-07-24 16:30:54 字數 2797 閱讀 2986

最近都在準備著考試,沒有寫部落格,今天忙裡偷閒,寫點關於裁切演算法的文字。

這次要幹的事情是給定乙個凸多邊形的點描述和矩形的點描述,按著矩形來對多邊形區域進行裁切。

大概如下圖所示:

藍色矩形是裁剪框,相當於photoshop裡的選區,紅色多邊形是影象,裁剪後在紅色以外的部分被剪掉,相交邊用橙色線條表示。(注意:這裡是按區域裁切,不是對線條裁切);

那麼我們應該按照怎樣的思路來裁切呢?考慮到我們輸入的是多邊形的點描述,兩點構成一條線段,參照矩形框直線裁剪演算法,直線段要麼都在矩形內,要麼都在矩形外,要麼與矩形相交三種情況,不過這和直線裁切演算法略有區別,原因是直線只有兩點,多邊形有多點

因此,我們假設有兩個頂點sp,p點表示待裁定的點,s點是p點的前一點,思路如下

情況1:直線段都在裁剪邊可見側

對於這種情況,保留p點(圖中未標出)

情況2:直線段都在裁剪邊不可見側

對於這種情況,不保留p點(圖中未標出)

情況3:s在直線段可見側,p點不在可見側

保留s,p與裁剪邊的交點

情況4:s在不可見側而p點在可見側

保留s,p與裁剪邊的交點和p點

看到圖中只有一條裁剪邊,可以知道對於四條裁剪邊要分別進行裁剪。為了便於區分,我們從底邊開始為矩形的點進行編號,如下圖:

這樣編號是為了在程式中使用結構體來表示邊,0號點和1號點可以很好地區分底邊和頂邊,左邊和右邊

舉個例子:

底邊:1號點的橫座標x比0號點的大

頂邊:1號點的橫座標x比0號點的小

(講個故事:有一天,我在叢林中偶然撿到一本計算機圖形學基礎入門秘籍,不知是哪位前輩留在這地方,翻到了圖形裁切,然而這一部分偽**,在判斷乙個點是否在可見側的時候,傳入的引數是邊,判斷該邊是底邊還是頂邊,是左邊還是右邊,再來判斷點的位置,根本沒有寫清楚上下左右邊的性質以及為何這麼編碼,簡直就是一言不合就貼**的,我看著偽**,一臉懵逼度過了好幾個小時,論證猜想,最終猜到編寫這本秘籍的前輩留下的文字所表達的意思,最終編碼除錯,還是很有意思,應該猜得對90%吧,畢竟前輩……)

最終**如下:

呼叫部分:

void

cgraphicdlg::polygonclip_sutherlandhodgman(vector

& invertexarray, float

left, float

right, float

top, float

down, colorref

color)

,,, };

for (int i = 0; i < 4; i++) }

vector

in;for (int i = 0; i < invertexarray.size(); i++) ); }

polygon(in, color, 1, 0);

return

void(); }

裁剪部分:

void

cgraphicdlg::sutherlandhodgman(vector

& invertexarray, vector

& outvertexarray, clipedge & clipboundary)

else }

else

if (inside(s, clipboundary))

s = p; }

} 判斷點的位置:

bool

cgraphicdlg::inside(vertex & testpt, clipedge & clipboundary)

else

if(clipboundary.p[0].x>clipboundary.p[1].x)

else

if (clipboundary.p[1].y > clipboundary.p[0].y)

else

if (clipboundary.p[0].y > clipboundary.p[1].y)

return

false; }

求交部分:

void

cgraphicdlg::intersect(vertex & s, vertex & p, clipedge

clipboundary, vertex & intersectpt)

else }

效果圖:

【多說一句】

這裡是在矩形框下的裁切,如果需要在多邊形邊下的裁切,則需要對邊進行定義,哪邊是可見的,哪邊是不可見的,還有求交點的方式,這幾塊都可以找到合適的演算法來做判別。

另外,上述演算法只能作用於凸多邊形,凹多邊形可能會引起不適,用前需謹慎。

劃分凸多邊形

時間限制 800ms 記憶體限制 65535k 提交次數 0 通過次數 0 題型 程式設計題 語言 g gcc vc 問題描述 乙個正凸n邊形,可以用n 3條互不相交的對角線將正n邊形分成n 2個三角形。現在要求讀入n邊形的n n 20 輸出不同劃分方法的總數 要求解的是劃分方法數,而不需要輸出各種...

469 凸多邊形

題目描述 給定乙個按順序連線的多邊形的頂點,判斷該多邊形是否為凸多邊形。凸多邊形的定義 注 頂點個數至少為 3 個且不超過 10,000。座標範圍為 10,000 到 10,000。你可以假定給定的點形成的多邊形均為簡單多邊形 簡單多邊形的定義 換句話說,保證每個頂點處恰好是兩條邊的匯合點,並且這些...

驗證多邊形是否為凸多邊形

驗證多邊形是否為凸多邊形 2108 shape of hdu include define debug 0 int crossmulti int x0,int y0,int x1,int y1,int x2,int y2 int main int n,i int f x,f y 第1個點 int s...