計算機圖形學 - 觀察與裁剪



裁剪在計算機圖形學中的主要用途是去除視區之外的物件、線條或線段。觀察變換對點相對於觀察體積的位置不敏感——尤其是那些在觀察者後面的點——因此在生成檢視之前必須去除這些點。

點裁剪

從給定視窗裁剪點非常容易。考慮下圖,其中矩形表示視窗。點裁剪告訴我們給定點 (X, Y) 是否在給定視窗內;並決定我們是否將使用視窗的最小和最大座標。

如果 X 位於 Wx1 ≤ X ≤ Wx2 之間,則給定點的 X 座標在視窗內。同理,如果 Y 位於 Wy1 ≤ Y ≤ Wy2 之間,則給定點的 Y 座標在視窗內。

Point Clipping

線裁剪

線裁剪的概念與點裁剪相同。線上裁剪中,我們將剪掉視窗外部的線段,只保留視窗內部的線段。

Cohen-Sutherland 線裁剪

此演算法使用下圖所示的裁剪視窗。裁剪區域的最小座標為 $(XW_{min,} YW_{min})$,裁剪區域的最大座標為 $(XW_{max,} YW_{max})$。

Cohen-Sutherland Line Clipping

我們將使用 4 位來劃分整個區域。這 4 位分別表示區域的頂部、底部、右側和左側,如下面的圖所示。這裡,頂部左側位被設定為 1,因為它位於左上角

TOP-LEFT Corner

對於直線,存在 3 種可能性:

  • 直線可以完全位於視窗內(此直線應被接受)。

  • 直線可以完全位於視窗外(此直線將完全從區域中移除)。

  • 直線可以部分位於視窗內(我們將找到交點,並僅繪製位於區域內的線段)。

演算法

步驟 1 - 為每個端點分配區域程式碼。

步驟 2 - 如果兩個端點的區域程式碼均為0000,則接受此直線。

步驟 3 - 否則,對兩個區域程式碼執行邏輯運算。

步驟 3.1 - 如果結果不是0000,則拒絕此直線。

步驟 3.2 - 否則,您需要裁剪。

步驟 3.2.1 - 選擇視窗外部的直線端點。

步驟 3.2.2 - 在視窗邊界處找到交點(基於區域程式碼)。

步驟 3.2.3 - 用交點替換端點並更新區域程式碼。

步驟 3.2.4 - 重複步驟 2,直到我們找到一條被平凡接受或平凡拒絕的裁剪直線。

步驟 4 - 對其他直線重複步驟 1。

Cyrus-Beck 線裁剪演算法

此演算法比 Cohen-Sutherland 演算法更有效率。它採用引數線表示和簡單的點積。

Cyrus-Beck Line Clipping

直線引數方程為:

P0P1:P(t) = P0 + t(P1 - P0)

設 Ni 為外法線邊 Ei。現在在邊 Ei 上選擇任意點 PEi,則點積 Ni.[P(t) – PEi] 決定點 P(t) 是“在裁剪邊內”還是“在裁剪邊外”或“在裁剪邊上”。

如果 Ni.[P(t) – PEi] < 0,則點 P(t) 在內部

如果 Ni.[P(t) – PEi] > 0,則點 P(t) 在外部

如果 Ni.[P(t) – PEi] = 0(交點),則點 P(t) 在邊上

Ni.[P(t) – PEi] = 0

Ni.[ P0 + t(P1 - P0) – PEi] = 0(用 P0 + t(P1 - P0) 替換 P(t))

Ni.[P0 – PEi] + Ni.t[P1 - P0] = 0

Ni.[P0 – PEi] + Ni∙tD = 0(將 D 替換為 [P1 - P0])

Ni.[P0 – PEi] = - Ni∙tD

t 的方程變為:

$$t = \tfrac{N_{i}.[P_{o} - P_{Ei}]}{{- N_{i}.D}}$$

它對於以下條件有效:

  • Ni ≠ 0(錯誤不可能發生)
  • D ≠ 0(P1 ≠ P0
  • Ni∙D ≠ 0(P0P1 不平行於 Ei

多邊形裁剪(Sutherland Hodgman 演算法)

也可以透過指定裁剪視窗來裁剪多邊形。Sutherland Hodgeman 多邊形裁剪演算法用於多邊形裁剪。在此演算法中,多邊形的所有頂點都針對裁剪視窗的每條邊進行裁剪。

首先,多邊形針對多邊形視窗的左邊緣進行裁剪,以獲得多邊形的新頂點。這些新頂點用於針對裁剪視窗的右邊緣、上邊緣、下邊緣裁剪多邊形,如下面的圖所示。

Polygon Before Filling

在處理多邊形與裁剪視窗的邊緣時,如果邊緣不完全位於裁剪視窗內,則會找到一個交點,並且從交點到外部邊緣的部分邊緣會被裁剪。下圖顯示了左、右、上和下邊緣裁剪:

Clipping Four Edges

文字裁剪

在計算機圖形學中,使用各種技術來提供文字裁剪。它取決於用於生成字元的方法和特定應用程式的要求。文字裁剪有三種方法,如下所示:

  • 全部或無字串裁剪
  • 全部或無字元裁剪
  • 文字裁剪

下圖顯示了全部或無字串裁剪:

All or None String Clipping

在全部或無字串裁剪方法中,我們根據裁剪視窗保留整個字串或拒絕整個字串。如上圖所示,STRING2 完全位於裁剪視窗內,因此我們保留它;STRING1 僅部分位於視窗內,因此我們拒絕它。

下圖顯示了全部或無字元裁剪:

All or None Character Clipping

此裁剪方法基於字元而不是整個字串。在此方法中,如果字串完全位於裁剪視窗內,則我們保留它。如果它部分位於視窗外,則:

  • 您僅拒絕字串的外部部分

  • 如果字元位於裁剪視窗的邊界上,則我們丟棄該整個字元並保留其餘字串。

下圖顯示了文字裁剪:

Text Clipping

此裁剪方法基於字元而不是整個字串。在此方法中,如果字串完全位於裁剪視窗內,則我們保留它。如果它部分位於視窗外,則

  • 您僅拒絕字串的外部部分。

  • 如果字元位於裁剪視窗的邊界上,則我們僅丟棄字元的視窗外部部分。

點陣圖圖形

點陣圖是描述影像的畫素集合。它是計算機圖形的一種型別,計算機使用它來儲存和顯示圖片。在這種型別的圖形中,影像逐位儲存,因此被稱為點陣圖圖形。為了更好地理解,讓我們考慮以下示例,其中我們使用點陣圖圖形繪製笑臉。

Smiley Face

現在我們將瞭解此笑臉如何在計算機圖形學中逐位儲存。

Bit Storage of Smiley Face

仔細觀察原始笑臉,我們可以看到有兩條藍線,在上圖中分別表示為 B1、B2 和 E1、E2。

同樣,笑臉分別使用 A4、B5、C6、D6、E5 和 F4 的組合位表示。

點陣圖圖形的主要缺點是:

  • 我們無法調整點陣圖影像的大小。如果您嘗試調整大小,畫素會變得模糊。

  • 彩色點陣圖可能非常大。

廣告