(12)裁剪之直線段裁剪

2021-07-25 17:56:02 字數 2390 閱讀 5115

圖形裁剪的定義:確定圖形在指定區域(即裁剪視窗)內的部分並保留,以及在區域外的部分並裁掉的過程稱為圖形裁剪。

假定:裁剪視窗為矩形視窗,左下點座標為(xl, yb),  右上點座標為(xr, yt)。 

定義:直線段裁剪就是保留給定線段在視窗內的部分。

直線段與視窗的位置關係有以下幾種情況:

⑴ 直線段兩個端點在視窗內(線段c);

⑵ 直線段兩個端點在視窗外,且與視窗不相交(線段d和e);

⑶ 直線段兩個端點在視窗外,但與視窗相交(線段b);

⑷ 直線段乙個端點在視窗內,乙個端點在視窗外(線段a)。

該演算法基於以下考慮:每一線段或者整個位於視窗內部,或者被視窗分割而使其中的一部分捨棄。  

演算法步驟:

第1步:確定一條線段是否整個位於視窗內,若是,則取之;

第2步:確定該線段是否整個位於視窗外,若是,則棄之;

第3步:若第1、2步判斷均不成立,則通過視窗邊界所在的直線將線段分成兩部分,再對每一部分進行第1、2步的測式。 

區域編碼:

實現該演算法時,需延長視窗邊界,把平面劃分為9個區域,每個區域用4位二進位制**表示。線段的兩個端點按其所在區域賦與對應的**,4位**的意義如下(從右到左): 

編碼規則可知:

①若兩個端點編碼都為0000,則直線段全部位於視窗內;

②若兩個端點編碼的位邏輯乘(按位與)不為0,則整條線段位於視窗外;

③若線段不能由以上兩種測試決定,則可能部分可見,需求交點,把線段再分割。

分割方法:

計算出直線段與視窗某一邊界(或邊界延長線)的交點,再用上述①、 ②兩種條件判別分割後的兩條線段,捨棄位於視窗外的一段。

例:用編碼裁剪演算法對ab線段裁剪,可以在c點分割,對ac、cb進行判別,捨棄ac,再分割於d點,對cd、db作判別,捨棄cd,而db全部位於視窗內,演算法結束。 

線段編碼不同分布情況下裁剪線段可見性分析:

①線段a全部在視窗內,則全部顯示,不需要求交點;

②線段b全部在視窗外(在視窗同側),則全部不顯示,不需要求交點;

③線段c一部分在視窗內,一部分在視窗外,則需要先求交點,再顯示兩交點之間的線段;

④線段d全部在視窗外(跨越三個區域),則只需要求交點一次即可判定剩下的線段全部在視窗外。

關於演算法實現過程中的幾點說明:

1)一般按固定順序檢測區號的各位是否為0。可按左→右→下→上或上→下→右→左的順序。

2)欲捨棄視窗外的子線段,只要用交點的座標值取代被捨棄端點的座標即可。

3)當需要求交點時,不必把線段與每條視窗邊界都求交,只要按順序檢測到端點區碼的某位不為0時,才把線段與對應的視窗邊界求交。 

編碼裁剪演算法的特點:

編碼方法直觀方便,速度較快,是一種較好的裁剪方法,但有兩個問題有待進一步解決:

①採用位邏輯乘(按位與)的運算,在有些高階語言中不便進行;

②全部捨棄的判斷只適合於那些僅在視窗同側的線段(如線段b),對於跨越三個區域的線段(如線段d),則不能一次作出判別而捨棄它們。

基本思想:分別尋找直線段兩個端點各自對應的最遠可見點,這兩個最遠可見點之間的線段即為要輸出的可見段。

線段p1、p2的端點p1的最遠可見點為i1,端點p2的最遠可見點為i2,則線段i1、i2為輸出的可見部分。

中點分割裁剪演算法的步驟: 

以找出直線段

⑴ 判斷直線段

⑵ 判斷p2點是否可見,若是,則p2點即為距p1點最遠的可見點(圖中b),返回;否則,繼續⑶。 

⑶ 將直線段

重複上述過程,直到

找到了距p1點的最遠可見點後,把兩個端點對調一下,即對直線段

中點分割裁剪演算法的特點:

該演算法中求線段中點可以由加法和移位來實現(除2運算可用移位完成),避免使用了乘除法。因此,該演算法易於用硬體來實現。如果允許兩個找最遠可見點的過程平行進行,則裁剪速度更快。 

Liang Barsky直線段裁剪演算法

考慮凸多邊形區域r和直線段p1p2 p t p2 p1 t p1 設a是區域r的邊界上一點,n是區域邊界在a點的內法線向量 則對於線段p1p2上任一點p t n p t a 0 外側 n p t a 0 內側 n p t a 0 邊界或其延長線上 凸多邊形的性質 點p t 在凸多邊形內的充要條件是,...

直線裁剪演算法

此演算法 就是cyrus beck裁剪演算法 1.判斷dx,dy是否為零作相應的簡單處理,並返回 2.下面通過例子說明第2步的原理,現在先給出原理 如果p1p2與裁剪區域有交點,那麼p1p2與裁剪區域存在交集,使得交集中的任一元素t同時滿足下列不等式 xmin x1 dx t xmax 1 ymin...

線段裁剪一 Cohen Sutherland演算法

cohen sutherland演算法 基本思想 對於每條線段p1p2 分為三種情況處理分為三種情況處理 1 若p1p2 完全在視窗內,則顯示該線段p1p2 簡稱 取 之。2 若p1p2 明顯在視窗外 及線段p1p2在視窗外 則丟棄該線段,簡稱 棄 之。3 若線段不滿足 取 或 棄 的條件,則在交點...