opengl演算法學習 直線裁剪演算法

2022-06-28 01:42:13 字數 2840 閱讀 8296

裁剪是從資料集合提取資訊的過程,它是計算機圖形學許多重要問題的基礎。裁剪典型的用途就是從乙個大的場景中提取所需的資訊,以顯示某一區域性場景或檢視。比如瀏覽地圖時,對感興趣的區域放大顯示,此時視窗內顯示的內容會相應減少。確定圖形的哪些部分在視窗內,哪些部分在視窗外(不可見區域),只顯示視窗內的那部分圖形,這個選擇處理過程就是裁剪。

這裡詳細講述兩種演算法

cohen-sutherland編碼裁剪演算法

cohen-sutherland編碼裁剪演算法

演算法思想

1)若線段完全在視窗之內則顯示該線段稱為「取」,

2)若線段明顯在視窗之外則丟棄該線段稱為「棄」

3)若線段既不滿足「取」的條件也不滿足「棄」的條件則把線段分割為兩段,對於完全在視窗之外的部分可棄之。

具體實現

為快速判斷一條直線段與矩形視窗的位置關係採用如圖所示的空間劃分和編碼方案(四位二進位制編碼上下右左)

裁剪一條線段時先求出兩端點所在的區號,若皆為零保留。

若端點編碼按位取與運算的結果不為零,意味著線段位於視窗之外,應捨棄。

否則求出線段與視窗某邊的交點並將該線段一分為二後,捨棄完全在視窗外的線段並對另一段重複上述處理。

**實現

稍後再補
liang-barsky演算法

概念

liang-barsky演算法的基本思想是,從 a、b 和 p1中找出最靠近 p2的點,如圖所示為 p1;從c 、d 和 p2中找出最靠近p1的點,顯然為c 點;也即 pc1即為裁剪後部分。

具體實現

對於區域內存在的線段p1p2,根據兩點座標構造方程

\[x=x_+u(x_-x_)

\]\[y=y_+u(y_-y_)

\]令\(\delta x=x_-x_ \delta y=y_-y_\)

即可推出

liang-barsky演算法通過計算兩端點擷取後的u值,繪製擷取後的線段,設擷取後線段的兩端點u為\(u_、u_\)

\(u_\)初始值=0,即線段初始點,\(u_\)初始值=1,即線段終點

對於x而言

\[x_ \leqslant x \leqslant x_

\]同理

\[y_ \leqslant y \leqslant y_

\]\[\rightarrow

\left\

x_ \leqslant x_+u\delta x \leqslant x_ \\

y_ \leqslant y_+u\delta y \leqslant y_

\end\right.

\]即可推得

\[\rightarrow

\left\

u\delta x \leqslant x_-x_ \\

-u\delta x \leqslant x_-x_ \\

u\delta y \leqslant y_-y_ \\

-u\delta y \leqslant y_-y_

\end\right.

\]構造

\[p_ \leqslant q_ ,k=

\]每個k對應上式每種情況

\[\rightarrow

\left\

p_=\delta x & q_=x_-x_ \\

p_=-\delta x & q_=x_-x_ \\

p_=\delta y & q_=y_-y_ \\

p_=-\delta y & q_=y_-y_

\end\right.

\]當\(p_=0\)時,該線段平行於輪廓線

如果\(q_<0\)

當k=1時,\(x_

當k=2時,\(x_

當k=3時,\(y_

當k=4時,\(y_

可推出若\(q_<0\)時,該線段位於裁剪區域外

如果\(q_\geqslant 0\)

則該線段位於區域內

當\(p_ \neq 0\)時,

此時線段延長線與輪廓線交點在上式中u值\(=\frac}}\)

若\(p_<0\) 則該線段部分為由邊界外到邊界內,\(u_=max(u_,u)\)

若\(p_>0\) 則該線段部分為由邊界內到邊界外,\(u_=min(u_,u)\)

通過以上過程,可推出擷取後線段兩端點的\(u_\)與\(u_\),若\(u_>u_\),則該線段不為於裁剪區域內

**實現

void liangbarsky(point p1,point p2,rectan rec)

}if(u1>u2) return ;

drawline(point(p1.x+u1*(p2.x-p1.x),p1.y+u1*(p2.y-p1.y)),point(p1.x+u2*(p2.x-p1.x),p1.y+u2*(p2.y-p1.y)),blue);

}

直線裁剪演算法

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

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 在凸多邊形內的充要條件是,...

算24 遞迴 演算法學習

問題 給出4個小於10個正整數,你可以使用加減乘除4種運算以及括 號把這4個數連線起來得到乙個表示式。現在的問題是,是否存 在一種方式使得得到的表示式的結果等於24。這裡加減乘除以及括號的運算結果和運算的優先順序跟我們平常 的定義一致 這裡的除法定義是實數除法 比如,對於5,5,5,1,我們知道5 ...