三、中點分割法
首先對直線段的端點進行編碼。
【核心思想:通過二分逼近來確定直線段與窗口的交點。】
具體方法:
1、若中點不在窗口內,則把【中點】和離窗口邊界【最遠點】構成的線段丟掉,以線段上的另一點和該中點再構成線段求其中點。
2、如果中點在窗口內,則又以中點和最遠點構成線段,並求其中點,直到中點與窗口邊界的坐標值在規定的誤差范圍內想等。
【問題】中點分割算法會不會無限循環二分下去?
由於屏幕像素是有限的而且會規定誤差范圍,一般計算次數不會太多。
四、Liang-Barsky裁剪算法——>【基本出發點:直線的參數方程】
Liang-Barsky算法是寫進國內外主流《計算機圖形學》教科書里唯一一個億中國人命名的算法。
【主要思想】
(1)用參數方程表示一條直線;
(2)把被裁剪的紅色直線段看成是一條【有方向】的【線段】,把窗口的四條邊分成兩類:入邊和出邊;
裁剪線段的起點是直線和兩條入邊的交點以及始端點三個點里最前面的一個點,即參數u【最大】的那個點;
裁剪線段的終點是直線和兩條出邊的交點以及端點最后面的一個點,即參數u【最小】的那個點;
【梁先生的重大發現】如果用u1,u2分別表示線段(u1<=u2)可見部分的開始和結束——>
由直線的參數方程可知:
線段和窗口邊界一共有四個交點,根據Pk的符號,可以知道那兩個是入交點,那兩個是出交點。:
【Liang-Barsky裁剪算法步驟】
(1)輸入直線段的兩端點坐標(x1,y1)、(x2,y2),以及窗口的四條邊界坐標:wxl,wxr,wyb,wyt;
(2)若Δx=0,則p1=p2=0,此時進一步判斷是否滿足q1<0或q2<0,若滿足,則直線段不在窗口內,算法轉(7)結束,否則,進一步計算Umax=max(0,Uk|pk<0)和Umin=min(Uk|pk>0,1),其中,Uk=qk/pk;(pk≠0,k=3,4)算法轉(5);
(3)若Δy=0,則p3=p4=0,此時進一步判斷是否滿足q3<0或q4<0,若滿足,則直線段不在窗口內,算法轉(7),否則,進一步計算Umax=max(0,Uk|pk<0)和Umin=min(Uk|pk>0,1),其中,Uk=qk/pk;(pk≠0,k=3,4)算法轉(5);
(4)若上述兩個條件均不滿足,則有pk≠0(k=1,2,3,4),此時計算Umax=max(0,Uk|pk<0,Uk|pk<0)和Umin=min(Uk|pk>0,Uk|pk>0,1)其中,Uk=qk/pk;(pk≠0,k=1,2,3,4);
(5)求得Umax和Umin后,進行判斷:若Umax>Umin,則直線段在窗口外,算法轉(7)若Umax≤Umin,帶入直線段參數方程;
(6)利用直線的掃描轉換算法繪制在窗口內的直線段;
(7)算法結束。
【裁剪算法舉例】
具體步驟如下:
對於直線EF,有:
P1=-2 q1=5 U1=-5/2
P2=2 q2=3 ——> U2=3/2
P3=-3 q3=4 U3=-4/3
P4=3 q4=2 U4=2/3
——>Umax=max(0,-5/2,-4/3)=0
Umin=min(1,3/2,2/3)=2/3
以,裁剪后的直線的兩個端點是(6,6)和(7.3,8)
【Liang-Barsky算法小結】
1、直線段看成有方向的;
2、直線參數化;
3、判斷線段上一點是否在窗口內,需滿足下面兩個不等式;
4、線段和窗口邊界一共有四個交點;
【Cohen—Sutherland 和Liang—Barsky裁剪算法的比較】
1、Cohen—Sutherland算法的核心思想是編碼;
2、如果被裁剪的圖形大部分線段要么在窗口內或者要么完全在窗口外,很少有貫穿窗口的,Cohen—Sutherland算法效果非常好;
3、在一般情況下,Liang—Barsky裁剪算法的效率更優於Cohen—Sutherland算法;
4、Cohen—Sutherland和Liang—Barsky只能應用於【矩形窗口】。