梁算法是計算機圖形學上最經典的幾個算法,也是目前唯一一個以中國人命名的出現在國內外計算機圖形學課本的算法,我之前在介紹裁剪算法的時候介紹過這個算法
https://www.cnblogs.com/wkfvawl/p/11705842.html#_label3
這幾天復習圖形學,發現當時那篇博客寫的很空洞,一些關鍵性的推理式子講的不是很清楚,於是在這里仔細介紹一下。
最近發現中國大學MOOC上中國農業大學的趙明教授講的很不錯,課程短小精悍,感興趣的同學可以去看一下https://www.icourse163.org/course/CAU-45006?from=study
一、直線的參數方程
梁算法表示直線是通過直線的參數方程來確定的,也就是說給出兩個點,利用參數表示直線。
這里對U的理解就是(x,y)點在所給兩點之間線段上的位置。
二、出邊和入邊
把被裁剪的紅色直線段看 成是一條有方向的線段,把窗口 的四條邊分成兩類:
入邊和出邊
入邊:直線由窗口外向窗口內移動時和窗口邊界相交的邊(左邊界和下邊界)。
出邊:直線由窗口內向窗口外移動時和窗口邊界相交的邊(右邊界和上邊界)。
裁剪結果的線段起點是直線和兩條入邊的交點以及始端點三 個點里最前面的一個點,即參數u最大的那個點;
裁剪線段的終點是和兩條出邊的交點以及端點最后面的一個 點,取參數u最小的那個點。
值得注意的是,當u從-∞到+∞遍歷直線時,首先對裁剪窗口的兩條邊界直線(下邊和左邊)從外面向里面移動,再對裁剪窗口兩條邊界直線(上邊和右邊)從里面向外面移動。
如果用u1,u2分別表示 線段(u1≤u2)可見部分的開始和結束
上面就是梁友棟先生的發現,但又有了新的問題:
如何判斷出邊和入邊?
四個U值是如何求出來的?
判斷線段某一部分是否在窗口內,可以簡化為判斷直線上一個點是否在窗口內的問題。
我們知道梁友棟算法的基本出發點是直線的參數方程,那么對於那些不會被裁剪掉的點一定會滿足下面的不等式:
三、運算所用的量
將上面的不等式移項得:
在這里可以確定那些直線與裁剪窗口的交點中PK<0的點輸入入邊,PK>0的點屬於出邊
1)分析Pk=0的情況
如果還滿足qk<0
則線段完全在邊界外,應舍棄該線段
如果qk≥0
則進一步判斷
(2)當pk≠0時:
當pk<0時
線段從裁剪邊界延長線的外部 延伸到內部,是入邊交點
當pk > 0時
線段從裁剪邊界延長線的內部 延伸到外部,是出邊交點
線段和窗口邊界一共有四個交點,根據pk的符號,就知道 哪兩個是入交點,哪兩個是出交點
當p k < 0時:對應入邊交點
當p k > 0時:對應出邊交點
一共四個u值,再加上u=0、u=1兩個端點值,總共六個值
把pk<0的兩個u值和0比較去找最大的,把pk>0的兩個u值 和1比較去找最小的,這樣就得到兩個端點的參數值
四、小結
直線參數化
直線段看成是有方向的
把窗口的四條邊分為入邊和出邊