1. 程式人生 > >計算機圖形學幾何工具演算法詳解 第一章 緒論

計算機圖形學幾何工具演算法詳解 第一章 緒論

計算機圖形學幾何工具演算法詳解 這本書在網上只找到影印版,很多文字都不太清晰,看起來有點兒費勁,故轉錄成普通文字版。

1.1 如何使用本書

本書包含許多方面的內容。簡單地瀏覽一下目錄,就可以知道本書是一本關於二維和三維幾何演算法的書籍,這些演算法可應用於計算機圖形學和其他領域。本書各章節的組織方式便於讀者找到感興趣的演算法,並使各章節的內容儘可能地互相獨立,因此,本書非常適合作為參考書,供經驗豐富的業界人士為手頭的專案查詢特定的演算法。

然而,本書不僅僅是一本參考書。仔細地研究本書的內容就會發現,許多用於分析幾何問題的概念都是通用的。

例如,考慮計算不同圖元對(比如點、線段、三角形、矩形四面體或框)之間的距離這一三維幾何問題。每一對圖元對之間的距離都可根據有關圖元形狀的特定知識來分析。分析該問題的常用的統一方法是用不同的引數來表示不同的圖元,即零、一、二、三分別表示點、線段、三角形或矩形、四面體或框。位於不同圖元上的任意兩點之間的距離平方表示式是一個包含適當引數的二次多項式。這兩個圖元之間的距離平方就是該二次多項式的最小值。搜尋該函式的值域,將找到位於不同圖元上的最近的兩個點所對應的變數值,以及相應的兩個圖元之間的最小距離平方。

搜尋引數域的思想是用於計算兩個凸多面體之間距離的GJK距離演算法的基礎。解決不同問題的通用思想形成了計算機圖形學L作者解決新問題必須具備的一組分析工具的實現基礎。因此,本書也非常適合作為學習工具,用以幫助相關人員實踐計算機圖形學科學。而且,我們相信,本書是一本用於計算機圖形學幾何演算法課程的好教材。

有些讀者希望,在投入幾何演算法分析之前,首先掌握理解這種分析所必需的基礎數學工具的適當知識。為了滿足他們的需要,本書的前三章簡要介紹了向量和矩陣代數。

本書的附錄包括對三角幾何公式的回顧及用於本書演算法的許多數值方法的概要。我們的目的是在本書中包含足夠的基礎知識和先進資料,以使讀者能很好地理解所有的演算法。然而,實現這些演算法需涉及許多的概念,為了完整地理解這些相關的概念,讀者可能需要學習其他的資料。比如,有些演算法需要求解多項式方程系統。可用多種方法來求解一個系統,有的方法在數值精度上更加適合於特定的演算法。我們當然鼓勵讀者學習儘可能多的相關材料並掌握足夠的知識,以解決應用中出現的各種問題。掌握的知識越多,解決實際問題的能力越強。

1.2 關於數值計算的若千問題

我們認為本書能滿足許多領域的讀者的需求。無論是哪個領域的讀者,在計算機程式設計中都不可避免地面臨一個難題,即必須處理浮點數系統中出現的計算問題。當然,總的來說,在試圖實現演算法之前,必須先充分地理解演算法的理論要點。但是僅有理論上的理解是不夠的。熟悉浮點數系統的程式設計師都知道這一點,只有他們才能體會其中的奧妙,他們能找到許多你根本想像不到的方法,來證明你的程式邏輯是根本行不通的。

1.2.1 低層問題

用理論公式來表示兒何演算法時,通常採用實數。在浮點系統中編碼實現這些演算法時,我們將直接面臨的一個問題是,並非所有的實數都表現為浮點數。

如果r是一個實數,設 f

( r ) f(r) 為其浮點數表示。在大多數情況下,f 被四捨五入成最接近的浮點數或者被捨去小數部分。無論釆用哪種方法,用 f 表示 r 的絕對誤差為 f ( r ) r |f(r) - r| 。其相對誤差為 f ( r ) r / r |f(r) - r| / |r| (假設r≠0)。

浮點數的算術運算也會產生數值誤差。如果r和s都是實數,它們之間的四則基本運算為:加,r+s ;減,r-s;乘,r×s;除,r/s。假設用由 , , , \oplus, \ominus, \otimes, \oslash 來表示對應的浮點算術運算。則和r+s近似表示為 f ( r ) f ( s ) f(r)\oplus f(s) ,差r-s近似表示為 f ( r ) f ( s ) f(r)\ominus f(s) 等。 浮點數不會保持實數的般算術性質。比如,如果s≠0,則 r + s r r + s \neq r 。但是 f ( r ) + f ( s ) = f ( r ) f(r) + f(s) = f(r) 是可能成立的,特別是當f®在數量上比f(s)大得多時。

實數加法具有結合性和交換性。它與相加數字的次序無關。但是,浮點數加法與相加數字的次序有關。假設已有數字r,s,以及將要與它們相加的t。在實數運算中, ( r + s ) + t = r + ( s + t ) (r+s) + t = r + (s+t) 。在浮點數算術中, ( f ( r ) f ( s ) ) f ( t ) = f ( r ) ( f ( s ) f ( t ) ) (f(r)\oplus f(s) ) \oplus f(t) = f(r)\oplus ( f(s) \oplus f(t)) 卻不一定成立。例如,假設f®在數量上比f(s)和f(t)大得多,則有
f ( r ) + f ( s ) = f ( r ) , f ( r ) + f ( t ) = f ( r ) ) f(r) + f(s) = f(r), f(r) + f(t) = f(r)) 。於是有 ( f ( r ) f ( s ) ) f ( t ) = f ( r ) f ( t ) = f ( r ) (f(r)\oplus f(s) ) \oplus f(t) = f(r) \oplus f(t) = f(r) 。但是有可能使 f ( s ) f ( t ) f(s) \oplus f(t) 足夠大,使得 f ( r ) ( f ( s ) f ( t ) ) f ( r ) f(r)\oplus ( f(s) \oplus f(t)) \neq f(r) 。這樣就產生了違反結合性的例子。

一般地,非負浮點數求和應該按從小到大的順序進行,以避免大數遮蔽小數

如果 r 1 r n r_1 \cdots r_n 到m是將要相加的數,如果它們的大小次序為 r 1 r n r_1 \leqslant \cdots \leqslant r_n ,則在浮點加法中的相加次序應該為 ( ( f ( r 1 ) f ( r 2 ) ) f ( r 3 ) ) f ( r n ) ((f(r_1) \oplus f(r_2)) \oplus f(r_3)) \oplus \cdots \oplus f(r_n)

其他需要關注的浮點問題是:兩個數量幾乎相等的數相減,或者除以接近零的數所得的有效數字的消去,這兩種情況都將產生不可接受的四捨五入誤差。演示糾正這兩種誤差的方法的一個典型例子,就是求解當 a 0 a \neq 0 時的二次方程 a x 2 + b x + c = 0 ax^2 + bx + c = 0 。其理論根為

x 1 = b + b 2 4 a c 2 a x 2 = b b 2 4 a c 2 a x_1 = \frac{-b + \sqrt{b^2 - 4ac}}{2a} 和 x_2 = \frac{-b - \sqrt{b^2 - 4ac}}{2a}

假設b>0並且 b 2 b^2 在數量上比4ac大得多,則 b 2 4 a c \sqrt{b^2 - 4ac} 將近似等於b,因此x的分子由數量幾乎相等的兩個數之差決定,這將導致有效數字的損失。注意, x 2 x_2 並不受上述問題的影響,因為它的分子沒有數字消去。一種糾正方法是,觀察到x等價於
x 1 = 2 c b + b 2