【文章內(nèi)容簡(jiǎn)介】
參數(shù)窗口值, oldPoint 表示鼠標(biāo)移動(dòng)前的位置, newPoint 表示鼠標(biāo)移動(dòng)后的位置。那么就可以得到如下式子: t m pDoubl e = xMa x xMi nxM i n = xMi n x * ( ne wP oi nt .x ol dP oi nt .x) 。xM a x = xMi n + t m pDoubl e 。t m pDoubl e = y Ma x y Mi n。y Mi n = y Mi n y * ( ne wP oi nt .y ol dP oi nt .y ) 。y Ma x = y Mi n + t m pDoubl e 。?? 經(jīng)過實(shí)驗(yàn)證明,這個(gè)方法對(duì) Julia 集與 Mandelbrot 集都適用。 圖形矢量移動(dòng)前后效果對(duì)比參見圖 與圖 。 2, Julia 集與 Mandelbrot 集的矢量放大 :先說明對(duì) Mandelbrot 集的放理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 8 大 ,Mandelbrot 集是將參數(shù) C 走遍參數(shù)窗口的所有值,經(jīng)過逃逸時(shí)間算法的運(yùn)算最終在繪圖窗口中畫出圖來,由此可知,參數(shù)窗口的大小和位置就決定了所繪 Mandelbrot 集的放大區(qū)域。已知 m a x m i n( ) /( 1 )x x x w id th? ? ? ?,m a x m in( ) /( 1 )y y y h e igh t? ? ? ?, min *tp p x p? ? ?, min *tq q y q? ? ? ,其中0,1, 2.. . 1txn??, 0,1, 2... 1tyn??,可以得出: minmin**p p x pq q y q? ? ?? ? ? 從而可得: 用計(jì)算機(jī)語言來描述就是: xMin = xMin + x* ol dP oint .x。xMa x = tm pD oub l e + x* ne w P oint .x。tm pD oub l e = y Min。y Min = y Min + y * ol dP oint .y 。y Ma x = tm pD oub l e + y * ne w P oint .y 。???? 這樣我們只要將得到的 (xMin,yMin), (xMax,yMax)代替原來的參數(shù)窗口值就可以實(shí)現(xiàn)對(duì)窗口的放大 了。 Julia 集的放大原理與 Mandelbrot 集的放大原理相同,就不再贅述了。 圖形的矢量放大前后效果對(duì)比見圖 與圖 。 3, Julia 集的旋轉(zhuǎn): 由計(jì)算機(jī)圖形學(xué)可知,在二維平面上按指定位置 rr(x,y) 旋轉(zhuǎn),需要經(jīng)過三個(gè)步驟: 平移對(duì)象使移動(dòng)點(diǎn)位置移到坐標(biāo)原點(diǎn)。 繞坐標(biāo)原點(diǎn)旋轉(zhuǎn)。 平移對(duì)象使基準(zhǔn)點(diǎn)回到其原始位置。將其寫成矩陣形式如下: 39。39。m in m in m in39。39。m in m in m inm a x m a x m a x39。39。m a x m a x m a x****p p x pq q x qp p x pq p x p? ? ?? ? ?? ? ?? ? ?理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 9 1 0 0 c os s i n 0 1 00 1 0 * s i n c os 0 * 0 10 0 1 0 0 1 0 0 1c os s i n ( 1 c os ) s i ns i n c os ( 1 c os ) s i n0 0 1rrrrxyxyyx????? ? ? ?? ? ? ???? ? ? ? ? ?? ? ? ? ? ???? ? ? ? ? ?? ? ? ? ? ?? ? ? ? ? ?? ? ????????? 轉(zhuǎn)換成式子如下: 39。 r r r39。 r r rx = x + ( x x ) * c o s ( y y ) * s iny = y + ( x x ) * s in + ( y y ) * c o s?? 將這個(gè)式子應(yīng)用到 Julia 集繪制算法中,這里假定繞屏幕的中點(diǎn)旋轉(zhuǎn),屏幕的寬度為 width,高度為 height,用坐標(biāo)表示為 (width/2, height/2),從前面繪制 Julia 集的方法中可知下列兩個(gè)步驟: ○ 1 0 min *xx x n x? ? ?, 0 m in *yy y n y? ? ?。 ○ 2 根據(jù)下列的迭代過程從 ( , )ttxy 算出 11( , )nnxy??,計(jì)數(shù) t=t+1。 2211 2t t tt t tx x y py x y q??????? 這里只需要修改 ,xynn的值,所以可得: xx x yyte m p = nn = w idth /2 + ( n w idth /2) * c o s ( n h e igh t/ 2 ) * sinn = h e igh t/ 2 + ( te m p w idth /2) * sin + ( n y h e igh t/ 2 ) * c o s???? 再將獲得的 ,xynn,進(jìn)行 m in *txx x n x? ? ?, m in *tyy y n y? ? ?的運(yùn)算,得到新的,ttxy。再將 ,ttxy進(jìn)行下一步運(yùn)算即可實(shí)現(xiàn)對(duì) Julia 集的旋轉(zhuǎn)。圖形的矢量旋轉(zhuǎn)前后效果對(duì)比見圖 與圖 。 4, 將 Julia 集壓縮到 Mandelbrot 集的收斂區(qū)域,要將 Julia 集壓縮到Mandelbrot 集收斂區(qū)域中, 需要先對(duì)前面繪制 Julia 集算法中提到的 ( , )nnxy進(jìn)行 Mandelbrot 集算法變換,然后再進(jìn)行 Julia 集算法變換。又因?yàn)樘右輹r(shí)間算法繪制 Julia 集和繪制 Mandelbrot 集的步驟都是一樣的,差別只體現(xiàn)在步驟 ○ 3 ,即由 ( , )nnxy 計(jì)算出 11( , )nnxy??這一步。 即要在前面提到的繪制Julia 集的計(jì)算機(jī)算法步驟 ○ 2 后面添加下列幾步算法: ○ A 令 t1= 0x ,t2= 0x , i=0, t3=t4=0,N=10 進(jìn)行如下循環(huán)。 ○ B 理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 10 00t 3 = t 1 * t 1 t 2 * t 2 + x 0 .7t 4 = 2 * t 1 * t 2 + yt 1 = t 3t 2 = t 4 計(jì)數(shù) i=i+1。 ○ C 如果 iN,返回步驟 ○ B ,否則 00x =t1,y =t2 。 ○ D 返回值 00x,y ,回到算法步驟 ○ 3 繼續(xù)進(jìn)行運(yùn)算。 算法的效果圖參見圖 。 二維元胞自動(dòng)機(jī)生成分形圖案 元胞 分布在二維歐氏幾何平面上規(guī)則劃分的網(wǎng)格點(diǎn)上,則稱它為二維元胞自動(dòng)機(jī)。為了使用二維元胞自動(dòng)機(jī)繪圖,假定有一個(gè) aa? 的網(wǎng)絡(luò),其左上角的格子為( 0,0),右下角的格子為( a1,a1),這樣主要是為了對(duì)應(yīng)計(jì)算機(jī)的屏幕坐 標(biāo) 。 且 每 個(gè) 格 子 的 初 始 狀 態(tài) 均 為 0 ,即 F(x,y)=0 ,設(shè)0 0 0 0/ 2 , / 2 , ( , ) 1x a y a F x y? ? ?,將此網(wǎng)格的中心部分 00( , )xy 點(diǎn)為中心,將 00( , )xy以 外的點(diǎn)分成若干層次,緊靠 00( , )xy 的 8 個(gè)點(diǎn)為第一層,緊靠第一層外面的 16點(diǎn) 為第二層,緊靠第二層外面的 24 個(gè)點(diǎn)為第三層,以此類推,一直到最外面一層。 此網(wǎng)格共有 a/2 層,設(shè) k 為層數(shù),從 k=1 到 k=a/2,進(jìn)行如下循環(huán): ○ 1 設(shè)第 k 層中任意點(diǎn)為 ( , )iixy ,則判斷其臨近 8 點(diǎn)的現(xiàn)有狀態(tài);如果 ( 1 , 1 ) ( , 1 ) ( 1 , 1 ) ( 1 , )( 1 , 1 ) ( , 1 ) ( 1 , 1 ) ( 1 , )i i i i i i i ii i i i i i iF x y F x y F x y F x yF x y F x y F x y F x y? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? 奇 數(shù) 則 ( , ) 1iiF x y ? 否則 ( , ) 0iiF x y ? 當(dāng)每一層中所有點(diǎn)判斷完結(jié)后,進(jìn)行下一步。 ○ 2 對(duì) ( , ) 1iiF x y ? 的點(diǎn)著色。 ○ 3 k=k+1,返回到步驟 ○ 1 ,直至循環(huán)結(jié)束。 圖形參見:圖 。 理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 11 GumowskiMira 公式 1980 年 , 工作在 CERN 的物理學(xué)家 Gumowski, I. 和 Mira, C. 嘗試計(jì) 算模擬基本粒子軌跡 (The trajectories of elementary particles) 在加速器 (Accelerator) 中的行為 。 他們使用了這組方程 : n+ 1 nn+ 1 n+ 1x = b * + f (x ) y = x + f (x ) ny 其中的函數(shù) F(x)是他們所考慮的模型 , 其中一個(gè)主要的模型他們使用了 : f ( x) = a * + 2* ( 1 a ) * x* x/ ( 1+x* x) x 其中 a 是一個(gè) 參數(shù) , 通常在 1 和 1 之間 , b 是一個(gè)非常敏感的常數(shù) , 通常非常接近于 。 如果 b 有一個(gè)輕微增長(zhǎng)到 , 軌跡會(huì)膨脹 , 或者螺旋向外至無限 ; 如果 b 有一個(gè)輕微的減小 , 比如 , 那么軌跡會(huì)收縮至奇異吸引子 (The attractor points)。 最后一個(gè)重要的影響因素是初始值 , 典型的初始值 X 和 Y 在 20和 20 之間 。 下面是繪制 GumowskiMira 分形圖的算法: ○ 1 假定 a=, b=, i=0, x=1, y=1。 ○ 2 進(jìn)行 計(jì)算: z = x 。x = b * y + w 。w = a * x + 2 * ( 1 a ) * x * x / ( 1 + u ) 。y = w z 。i = i + 1。 ○ 3 如果 i1000, 對(duì)點(diǎn) (x*20,y*20)著色,返回步驟 ○ 2 。 如果 i 1000? , 結(jié)束循環(huán)。 圖形參見:圖 。 分形圖形的位圖操作 1, 圖形的保存:圖形的保存可以分為三個(gè)步驟,先獲取用戶想要將圖形保存為的文件名,然后再將當(dāng)前客戶區(qū)的圖形拷貝成位圖,最后將位圖寫入文件。 理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 12 ○ 1 獲取文件名可以使用 CFileDialog 類,初始化 CFileDialog 類后,使用類成員函數(shù) DoModal()顯示對(duì)話框。然后使用類成員函數(shù) GetFileName()就可以獲得用戶輸入的文件名。 ○ 2 將當(dāng)前客戶區(qū)域拷貝為位圖操作比較復(fù)雜,這里只能將其簡(jiǎn)略化后再加以描述。要將當(dāng)前客戶區(qū)域拷貝為位圖,需要先獲取當(dāng)前窗口的句柄,這個(gè)可以使用函數(shù) HWND GetSafeHw nd( ) const。得到。然后需要確定當(dāng)前客戶區(qū)域的大小,而這個(gè)可以使用函數(shù) void GetClientRect( LPRECT lpRect ) const。得到,函數(shù)中的參數(shù) lpRect 表示客戶區(qū)域的大小。為了拷貝客戶區(qū)的圖形到內(nèi)存,我寫了一個(gè)函數(shù) CopyClientRectToDIB(HWND hander,CRect rect),其中的 hander為當(dāng)前窗口的句柄, rect 表示客戶區(qū)域的大小。在函數(shù)中,因?yàn)檫@里要將客戶區(qū)坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo) (如欲深入了解,請(qǐng)參見《 Windows 編程》第五章 圖形基礎(chǔ) ),所以要先用函數(shù) void ClientToScreen( LPRECT lpRect ) const 將顯示區(qū)域坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)。得到需 要的客戶區(qū)域 lpRect 后,將 lpRect 指向的區(qū)域拷貝成 Bitmap,使用 BitBlt(HDC,int,int,int,int,HDC,int,int,unsigned long)??梢赃_(dá)到要求。最后將指向位圖的句柄返回。 ○ 3 將位圖保存到磁盤,這個(gè)操作比較簡(jiǎn)單,創(chuàng)建一個(gè)使用用戶輸入的文件名的文件,然后將圖形寫入文件即可。 2, 位圖的復(fù)制和剪切。位圖的復(fù)制和剪切原理是相同的,它們不同點(diǎn)在于剪切的時(shí)候需要在將選定區(qū)域復(fù)制后將其重畫為白色區(qū)域。復(fù)制圖形區(qū)域?yàn)槲粓D上面我們已經(jīng)