高階圖形繪製軟體的原理猜想

Atosh_Dustosh發表於2020-10-08

(因為直接把別的文件裡的貼上過來後,空格和製表符都會消失,所以偷懶全換成了“|”...)

考研複習空間幾何的時候突然想到matlab,R語言,還有java裡的一些繪圖包,然後就有點好奇它們的原理,照著自己的思路猜測了下,或許下面想的思路也是它們曾經某個版本的實現方式吧。不過隨著它們更新換代,我覺得它們一定採取了更加高效的方法來繪製圖形。儘管如此 ... 就當下面這個是一些個人的想法吧。

 

p.s. 沒學過圖形學,矩陣也忘了,也沒時間去實現,只是先把思路記錄在這裡。感覺這個思路還算不錯,不過還能夠進一步增加一些內容和改進(比如說具體的基準點尋找的策略,實現的優化等等),然而限於個人時間,就僅僅描述下面這些。

p.s. plus 最初是想著從零開始,用java,或者說C來實現一個圖形繪製的包,不過近期沒什麼時間,以後說不定會幹吧。。。(記得好像有前輩說過“‘以後再做’等於永遠不會去做”?)

 

||||- 掃描畫布
||||||||- 這種方式雖然實現起來邏輯簡單,但是特別費時,而且效率極低,精度也不是很高,不建議採用這種方式實現
||||||||- 另外,這種方式繪製二維圖形還可以,要是繪製三維圖形的話,計算量就近乎無法處理了
||||||||- 因為掃描畫布式實在太過低效,所以不作為單獨一節,下面主要是針對擴散式的描述
||||- 擴散式
||||- 原理(以二維圖為例)(關鍵是尋找基準點)
||||||||- 使用n條基準線,掃描這些線上的點,代入曲線公式f(x, y)=0中,然後取其中結果f(x0, y0)最接近0的幾個點(x0, y0)作為基準點
||||||||- 設定好初始的畫布視窗位置,比如說x和y座標上下±30以內,選取這個視窗之內,或是最接近這個視窗的基準點,然後同時沿著x和y的正反方向向兩頭擴散,每次擴散的座標距離根據畫布而定。如果在擴散的過程中,出現了f(x0, y0)的值超過某個閾值的情況,就將其捨棄,取另外的f(x0, y0)值最接近0的點作為函式影像的一個點,如此進行下去,直到超出畫布範圍。
||||- 關於不常見函式的處理
||||||||- 簡單來說,y=±x就足以處理大多數常見曲線,但是如果想要提升處理能力以及軟體效能,就需要具體規劃其它的基準線
||||||||- 具體來說,除了增加基準線的型別以外,還要考慮對數座標,基準線切換等等策略。
||||||||- 比如一個距離原點非常遠,但是半徑卻非常小的圓(或球),如果只靠最初選取的基準線,是幾乎不可能找到基準點的。這時可以考慮利用函式的單調性,在最接近基準點的地方進行基準線的重新設定,然後再次尋找基準點,重複這個步驟下去,總會找到基準點的。
||||||||- 或者,可以考慮對函式的原型進行分析,嘗試直接獲取一個基準點,然後進行擴散。
||||||||- 或者,可以考慮對空間進行劃分,結合對數座標,迅速縮小基準點的範圍,然後在這個範圍內再使用基準線尋找基準點。
||||- 非連續函式的處理
||||||||- 考慮到函式可能不是連續的,所以可能需要採用從多個基準點進行並行擴散,直到它們的定義域對接起來
||||||||- 如果所有基準點都已經擴散完畢,就需要尋找新的基準點
||||- 具體示例
||||||||- 就拿y=sin(x)來說,基準線y=x在(0, 0)就遇到了f(x0, y0)=0的情況,這時就可以直接從(0, 0)開始擴散
||||- 圖形化展示
||||||||- 二維圖形比較容易,直接就可以畫出來,三維圖形的展示就比較複雜了,需要一定的圖形學轉化。
||||||||- 三維空間下,比如,你計算出了一個橢球體的圖形,然後畫出了包含這個橢球體的一個範圍內的空間座標系,具體一點,可以是x^2+5*y^3+2*z^2=1,座標系範圍是(-5, -5, -5) ~ (5, 5, 5)
||||||||- 在繪製三維圖的時候,需要對已經計算出的點進行轉化。為了加快計算,還要把這些點組合成矩陣,或者說,在一開始就使用矩陣的形式儲存和計算,之後利用矩陣的變換,描出對應的點。
||||||||- 在描點的過程中,可能還要考慮到這些點在視覺上的前後位置,用不同的顏色將他們標出來,也就是將矩陣的某一片區域變色。
||||- 一些需要的技術
||||||||- 稀疏矩陣及其壓縮儲存
||||||||||||- 在圖形化展示時,計算出的點只有很少一部分有值,其它的都是0,這時候就是稀疏矩陣了。
||||||||||||- 即便這個圖形看起來有多大,它在那個座標空間裡面也就是一層紙,矩陣中表現出來的就是一小串有值的點,所以稀疏矩陣的相關知識對於效能優化來說是必需的。
||||||||- 平行計算
||||||||||||- 這個是進階要求。利用平行計算,加速基準點的查詢,進而提高軟體的響應速度。
||||||||- 圖形學基礎
||||||||||||- 這個要用在圖形的展示上,因為圖形從各個角度看去都不同,每次重新計算太浪費效能,需要利用矩陣變換簡化處理
||||||||||||- 另外,其它的一些進階的圖形展示也需要這一點。比如不同層次的染色,不同函式的標記等等。
||||- 優點
||||||||- 一旦找到了函式上的幾個點,就能立刻沿著這些點繪製出整個圖形
||||||||- 速度上相對畫布掃描式大幅度提升,精度上也因為計算量的降低,可以通過減小掃描的步長來獲得相對畫布掃描式更高的精度
||||- 缺點
||||||||- 基準點的尋找比較困難
||||||||- 並行程式設計
||||||||- 對比較“偏僻”的圖形的繪製比較困難,可能需要花費很長時間尋找,即便它的函式表示式很簡單,比如(x-99999)^2 + (y-99999)^2 = 0.0000001
||||||||- 計算機本身資料型別的精度限制

相關文章