高級圖形繪製軟件的原理猜測

(由於直接把別的文檔裏的粘貼過來後,空格和製表符都會消失,因此偷懶全換成了「|」...)java

考研複習空間幾何的時候忽然想到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
||||||||- 計算機自己數據類型的精度限制性能

相關文章
相關標籤/搜索