(因為直接把別的檔案里的粘貼過來后,空格和制表符都會消失,所以偷懶全換成了“|”...)
考研復習空間幾何的時候突然想到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
||||||||- 計算機本身資料型別的精度限制
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/163645.html
標籤:其他
