【正文】
edependent bitmap HPALETTE hPalette。 // return the handle to the DIB return hDIB。 lpRectbottom = 。 lpRecttop = 。pt2)。pt1)。 = lpRectbottom。 = lpRecttop。 POINT pt1, pt2。 } } 拷貝客戶區(qū)函數(shù): HDIB CGlobal::CopyClientRectToDIB(HWND hWnd, LPRECT lpRect) { HDIB hDIB = NULL。 HANDLE hDib = (GetSafeHwnd(), NowRect)。 理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 13 GetClientRect(amp。 附相關(guān)代碼如下: 圖片保存函數(shù): void CFractalView::OnFileSave() { CFileDialog dlg(TRUE, NULL, *.bmp,OFN_HIDEREADONLY ,Bmp Files(*.bmp)|*.bmp)。復(fù)制圖形區(qū)域?yàn)槲粓D上面我們已經(jīng)介紹過了,這 里不再贅述,而重畫選定區(qū)域也只需要一個(gè) Rectangle()函數(shù)就可以實(shí)現(xiàn)。 2, 位圖的復(fù)制和剪切。最后將指向位圖的句柄返回。得到需 要的客戶區(qū)域 lpRect 后,將 lpRect 指向的區(qū)域拷貝成 Bitmap,使用 BitBlt(HDC,int,int,int,int,HDC,int,int,unsigned long)。為了拷貝客戶區(qū)的圖形到內(nèi)存,我寫了一個(gè)函數(shù) CopyClientRectToDIB(HWND hander,CRect rect),其中的 hander為當(dāng)前窗口的句柄, rect 表示客戶區(qū)域的大小。然后需要確定當(dāng)前客戶區(qū)域的大小,而這個(gè)可以使用函數(shù) void GetClientRect( LPRECT lpRect ) const。要將當(dāng)前客戶區(qū)域拷貝為位圖,需要先獲取當(dāng)前窗口的句柄,這個(gè)可以使用函數(shù) HWND GetSafeHw nd( ) const。然后使用類成員函數(shù) GetFileName()就可以獲得用戶輸入的文件名。 分形圖形的位圖操作 1, 圖形的保存:圖形的保存可以分為三個(gè)步驟,先獲取用戶想要將圖形保存為的文件名,然后再將當(dāng)前客戶區(qū)的圖形拷貝成位圖,最后將位圖寫入文件。 如果 i 1000? , 結(jié)束循環(huán)。i = i + 1。w = a * x + 2 * ( 1 a ) * x * x / ( 1 + u ) 。 ○ 2 進(jìn)行 計(jì)算: z = x 。 最后一個(gè)重要的影響因素是初始值 , 典型的初始值 X 和 Y 在 20和 20 之間 。 他們使用了這組方程 : 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ù) , 通常非常接近于 。 圖形參見:圖 。 ○ 2 對(duì) ( , ) 1iiF x y ? 的點(diǎn)著色。 且 每 個(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)為第三層,以此類推,一直到最外面一層。 二維元胞自動(dòng)機(jī)生成分形圖案 元胞 分布在二維歐氏幾何平面上規(guī)則劃分的網(wǎng)格點(diǎn)上,則稱它為二維元胞自動(dòng)機(jī)。 ○ D 返回值 00x,y ,回到算法步驟 ○ 3 繼續(xù)進(jìn)行運(yù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。又因?yàn)樘右輹r(shí)間算法繪制 Julia 集和繪制 Mandelbrot 集的步驟都是一樣的,差別只體現(xiàn)在步驟 ○ 3 ,即由 ( , )nnxy 計(jì)算出 11( , )nnxy??這一步。圖形的矢量旋轉(zhuǎn)前后效果對(duì)比見圖 與圖 。 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。 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? ? ?。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。m in m in m inm a x m a x m a x39。m in m in m in39。將其寫成矩陣形式如下: 39。 繞坐標(biāo)原點(diǎn)旋轉(zhuǎn)。 圖形的矢量放大前后效果對(duì)比見圖 與圖 。???? 這樣我們只要將得到的 (xMin,yMin), (xMax,yMax)代替原來的參數(shù)窗口值就可以實(shí)現(xiàn)對(duì)窗口的放大 了。y Min = y Min + y * ol dP oint .y 。xMa x = tm pD oub l e + x* ne w P oint .x。 2, Julia 集與 Mandelbrot 集的矢量放大 :先說明對(duì) Mandelbrot 集的放理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 8 大 ,Mandelbrot 集是將參數(shù) C 走遍參數(shù)窗口的所有值,經(jīng)過逃逸時(shí)間算法的運(yùn)算最終在繪圖窗口中畫出圖來,由此可知,參數(shù)窗口的大小和位置就決定了所繪 Mandelbrot 集的放大區(qū)域。?? 經(jīng)過實(shí)驗(yàn)證明,這個(gè)方法對(duì) Julia 集與 Mandelbrot 集都適用。y Mi n = y Mi n y * ( ne wP oi nt .y ol dP oi nt .y ) 。xM a x = xMi n + t m pDoubl e 。令 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? ? ? ?,xMin, yMin, xMax, yMax 代表參數(shù)窗口值, oldPoint 表示鼠標(biāo)移動(dòng)前的位置, newPoint 表示鼠標(biāo)移動(dòng)后的位置。如果要對(duì)窗口中的圖形進(jìn)行移動(dòng),我們可以選擇使用移動(dòng)參數(shù)窗口的方法來實(shí)現(xiàn)。 Julia 集與 Mandelbrot 集圖形的矢量變換 1, Julia 集與 Mandelbrot 集的矢量移動(dòng):在逃逸時(shí)間算法中,一共有兩個(gè)窗口,一個(gè)是繪圖窗口,一個(gè)是參數(shù)窗口,其中繪圖窗口的大小與位置相對(duì)來說是固定的,因?yàn)樗鼘?duì)應(yīng)的是窗口的分辨率。 ^運(yùn)算在這里表示按位異或運(yùn)算符,它 對(duì)運(yùn)算符兩邊的數(shù)字的每一個(gè)位進(jìn)行計(jì)算,如果兩個(gè)位不同的話,那么運(yùn)算結(jié)果就為 1,否則為 0。運(yùn)算表示取這三個(gè)值的最低九個(gè)位, amp。 上面的 red, green, blue 分別表示 RGB 顏色模型中的 R, G, B。 if ((blue amp。 if ((green amp。用計(jì)算機(jī)語言來表示就是這樣: if ((red amp。如果 R,G,B 中的任何一個(gè)值大于0xFF,就對(duì)其進(jìn)行 ^0xFF 的位運(yùn)算。 下面對(duì)求得的 red, green, blue 三個(gè)值進(jìn)行變換。 green = k +m_nBlue。 顏色設(shè)置:我們根據(jù)逃逸時(shí)間算法的循環(huán)次數(shù)來給分形圖著色,假定 k 為循環(huán)次數(shù),也就是上面所說的逃逸時(shí)間, time 為顏色銳化值, m_nRed, m_nGreen,m_nBlue 為 R, G, B 的初始值,有如下結(jié)果: k *= time。 在數(shù)字視頻中,對(duì) RGB 三基色各進(jìn)行 8 位編碼就構(gòu)成了大約 萬種顏色,這就是我們常說的真彩色。 分形圖形著色方案 RGB 色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn),是通過對(duì)紅 (R)、綠 (G)、藍(lán) (B)三個(gè)顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的, RGB 即是代表紅、綠、藍(lán)三個(gè)通道的顏色,這個(gè)標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色,是目前運(yùn)用最廣的顏色系統(tǒng)之一。 ○ 6 讀完所有參數(shù)空間的點(diǎn)( p,q),結(jié)束循環(huán)。 如果 maxt Time? ,轉(zhuǎn)到步驟 ○ 5 。 ○ 2 令 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? ? ? ? ○ 3 利用下式從 ( , )kkxy 得到 11( , )kkxy??,計(jì)數(shù) k=k+1 2211 2k k kk k kx x y py x y q??????? ○ 4 計(jì)算 22ttr x y??: 如果 rM? ,則轉(zhuǎn)到步驟 ○ 5 。 2, 繪制 Mandelbrot 集:設(shè) Z=x+yi, C=p+qi, C 的取值范圍為: min maxmin max:[ , ]:[ , ]p p pq q q ○ 1 假設(shè)繪圖窗口的寬度為 width , 高 度 為 height 。著色方案將在下面作詳細(xì)介紹。 如果 maxt Time? ,轉(zhuǎn)到步驟 ○ 5 。 2211 2t t tt t tx x y py x y q??????? ○ 4 計(jì)算 22ttr x y??: 如果 rM? ,則轉(zhuǎn)到步驟 ○ 5 。對(duì)所有的點(diǎn)( , ) , 0 , 1 , 2 , 3. .. 1 0 , 1 , 2 , 3. .. 1x y x yn n n w idth n he ight? ? ? ?及,完成如下步驟的循環(huán): ○ 2 令 0 min *xx x n x? ? ?,0 m in *yy y n y? ? ?, t=0。 Julia 集的逃逸時(shí)間算法如下: 假設(shè)繪圖窗口的寬度為 width,高度為 height。如圖 所示,假設(shè)有一個(gè)充分大的整數(shù) N,當(dāng)未逃逸區(qū)域 M 中的初始點(diǎn) a 經(jīng)過小于 N 次迭代就達(dá)到未逃逸區(qū)域 M 的邊界,甚至超出了邊界,我們就認(rèn)為點(diǎn) a 逃逸出去了;而如果經(jīng)過 N 次迭代后, a 的軌跡仍未到達(dá) M 的邊界,我們就認(rèn)為 a 是 A