【正文】
up with math and arts, Along with time flying, people think over fractal more and more, even brought an argument that fractal drawing is or not an art. All think fractal picture is an art production today, and also, fractal is used more and more in puter science. The puter graphics even add a new fractal algorithm to create nature sight. Aside, fractal theory used wider and wider in other subjects. We can say, fractal theory will use wider and deeper. Key Words: Fractal, Julia set, Mandelbrot set, Vector transformation, Escaping time algorithm 理學(xué)學(xué)士學(xué)位論文 第一章 分形概論 1 第一章 分形概論 什么是分形 什么是分形呢?很難給分形下一個(gè)確切的定義。 因?yàn)榉中螆D形展示的是數(shù)學(xué)與藝術(shù)的成果,它日益受到人們的重視,甚至引發(fā)了分形是不是藝術(shù)的討論,隨著時(shí)間的流逝,分形是一種 藝術(shù)已經(jīng)為人們所承認(rèn),分形與計(jì)算機(jī)的結(jié)合也越來越緊密,計(jì)算機(jī)圖形學(xué)中已經(jīng)專門引入了分形算法,以生成自然景觀等。本文重點(diǎn)介紹了分形圖形的重要生成算法 —— 逃逸時(shí)間算法,并且詳細(xì)說明了使用逃逸時(shí)間算法生成 Julia集與 Mandelbrot 集的算法過程。可以簡單地說,如果一個(gè)對象的部分與整體具有自仿射變換關(guān)系,我們就可以 稱它為分形。自分形之父曼德勃羅( Benoit Mandelbrot)在 1975年出版專著《分形對象:形、機(jī)遇與維數(shù)》,標(biāo)志著分形理論正式誕生以來。另外,本文也 詳細(xì)說明了分形圖形的一種著色方案,它可以使分形圖形的著色過程更富有過渡性,從而使圖形具有更強(qiáng)的美感。另外,分形在其它學(xué)科的應(yīng)用也日益廣泛,可見,分形在今后會得到更大的發(fā)展,有更廣闊的應(yīng)用空間。 嚴(yán)格地而且正式地去定義分形是一件非常復(fù)雜而且困難的事情。 分形在英文中為 fractal,是由美籍法國數(shù)學(xué)家曼德勃羅 (Benoit Mandelbrot)創(chuàng)造出來的。 分形的應(yīng)用 分形幾何學(xué)已在自然界與物理學(xué)中得到了應(yīng)用。這是一種處處連續(xù),但又處處無導(dǎo)數(shù)的曲線。 自然界中更大的尺度上也存在分形對象。小于 1 公里的云朵,更受地形概貌影響,大于 1000 公里時(shí),地球曲率開始起作用。學(xué)會從實(shí)驗(yàn) 數(shù)據(jù)測算分維是最近的一大進(jìn)展。并且由于分形幾何方法的引入,使一些原已死寂的老學(xué)科方向煥發(fā)了新的生機(jī),也使一些正蓬勃發(fā)展的新學(xué)科獲得了巨大的推動力。并且分形圖形已經(jīng)開始應(yīng)用在包裝,服裝,陶瓷裝飾上面。 下面討論 2()f z z? 的一些性質(zhì),假設(shè)此方程以點(diǎn) 0 0 0z x y i?? ,且 0| | 1z? 開始迭代,則有: 220 0 0 0 0| ( ) | | 2 |F z x y x y? ? ? 2 2 2 20 0 0 0( ) ( 2 )x y x y? ? ? 4 4 2 2 2 20 0 0 0 0 024x y x y x y? ? ? ? 2 2 200()xy?? 因此,在區(qū)域 00 | | 1z??中, 00| ( ) | | |F z z? ,這意味著對 2()F z z? 的每一個(gè)一次迭代,即 21nnzz? ? ,都會使 z 向靠 0 的方向移動,可以說此時(shí) z 向 0 收斂。 然而,當(dāng) 0C? 時(shí),它向一個(gè)區(qū)域收斂,而不是向一個(gè)點(diǎn)收斂,被吸進(jìn)去的點(diǎn)會遍歷整個(gè)區(qū)間,我們稱這個(gè)區(qū)間為混沌區(qū)。如圖 所示,假設(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 上的點(diǎn),用這樣 的 方 法 描 繪 出 A 的 邊 界 圖 形 , 這 就 是 逃 逸 時(shí) 間 算 法 的 基 本 思 想 。對所有的點(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。 如果 maxt Time? ,轉(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 。 如果 maxt Time? ,轉(zhuǎn)到步驟 ○ 5 。 分形圖形著色方案 RGB 色彩模式是工業(yè)界的一種顏色標(biāo)準(zhǔn),是通過對紅 (R)、綠 (G)、藍(lán) (B)三個(gè)顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的, RGB 即是代表紅、綠、藍(lán)三個(gè)通道的顏色,這個(gè)標(biāo)準(zhǔn)幾乎包括了人類視力所能感知的所有顏色,是目前運(yùn)用最廣的顏色系統(tǒng)之一。 顏色設(shè)置:我們根據(jù)逃逸時(shí)間算法的循環(huán)次數(shù)來給分形圖著色,假定 k 為循環(huán)次數(shù),也就是上面所說的逃逸時(shí)間, time 為顏色銳化值, m_nRed, m_nGreen,m_nBlue 為 R, G, B 的初始值,有如下結(jié)果: k *= time。 下面對求得的 red, green, blue 三個(gè)值進(jìn)行變換。用計(jì)算機(jī)語言來表示就是這樣: if ((red amp。 if ((blue amp。運(yùn)算表示取這三個(gè)值的最低九個(gè)位, amp。 Julia 集與 Mandelbrot 集圖形的矢量變換 1, Julia 集與 Mandelbrot 集的矢量移動:在逃逸時(shí)間算法中,一共有兩個(gè)窗口,一個(gè)是繪圖窗口,一個(gè)是參數(shù)窗口,其中繪圖窗口的大小與位置相對來說是固定的,因?yàn)樗鼘?yīng)的是窗口的分辨率。令 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)移動前的位置, newPoint 表示鼠標(biāo)移動后的位置。y Mi n = y Mi n y * ( ne wP oi nt .y ol dP oi nt .y ) 。 2, Julia 集與 Mandelbrot 集的矢量放大 :先說明對 Mandelbrot 集的放理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 8 大 ,Mandelbrot 集是將參數(shù) C 走遍參數(shù)窗口的所有值,經(jīng)過逃逸時(shí)間算法的運(yùn)算最終在繪圖窗口中畫出圖來,由此可知,參數(shù)窗口的大小和位置就決定了所繪 Mandelbrot 集的放大區(qū)域。y Min = y Min + y * ol dP oint .y 。 圖形的矢量放大前后效果對比見圖 與圖 。將其寫成矩陣形式如下: 39。m in m in m inm a x m a x m a x39。 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? ? ?。圖形的矢量旋轉(zhuǎ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。 二維元胞自動機(jī)生成分形圖案 元胞 分布在二維歐氏幾何平面上規(guī)則劃分的網(wǎng)格點(diǎn)上,則稱它為二維元胞自動機(jī)。 ○ 2 對 ( , ) 1iiF x y ? 的點(diǎn)著色。 他們使用了這組方程 : 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 進(jìn)行 計(jì)算: z = x 。i = i + 1。 分形圖形的位圖操作 1, 圖形的保存:圖形的保存可以分為三個(gè)步驟,先獲取用戶想要將圖形保存為的文件名,然后再將當(dāng)前客戶區(qū)的圖形拷貝成位圖,最后將位圖寫入文件。要將當(dāng)前客戶區(qū)域拷貝為位圖,需要先獲取當(dāng)前窗口的句柄,這個(gè)可以使用函數(shù) HWND GetSafeHw nd( ) const。為了拷貝客戶區(qū)的圖形到內(nèi)存,我寫了一個(gè)函數(shù) CopyClientRectToDIB(HWND hander,CRect rect),其中的 hander為當(dāng)前窗口的句柄, rect 表示客戶區(qū)域的大小。最后將指向位圖的句柄返回。復(fù)制圖形區(qū)域?yàn)槲粓D上面我們已經(jīng)介紹過了,這 里不再贅述,而重畫選定區(qū)域也只需要一個(gè) Rectangle()函數(shù)就可以實(shí)現(xiàn)。 理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 13 GetClientRect(amp。 } } 拷貝客戶區(qū)函數(shù): HDIB CGlobal::CopyClientRectToDIB(HWND hWnd, LPRECT lpRect) { HDIB hDIB = NULL。 = lpRecttop。pt1)。 lpRecttop = 。 // return the handle to the DIB return hDIB。 // handle to DIB // get the devicedependent bitmap in lpRect by calling // CopyScreenToBitmap and passing it the rectangle to grab hBitmap = CopyScreenToBitmap(lpRect)。 // clean up DeleteObject(hPalette)。 // screen DC and memory DC HBITMAP hBitmap, hOldBitmap。 // screen resolution // check for an empty rectangle 理學(xué)學(xué)士學(xué)位論文 第二章 分形 相關(guān) 理 論 問題 15 //MessageBox((HWND)AfxGetApp()GetMainWnd(),122,123,NULL)。 // get points of rectangle to grab nX = lpRectleft。 // get screen resolution xScrn = GetDeviceCaps(hScrDC, HORZRES)。 if (nX2 xScrn) nX2 = xScrn。 // create a bitmap patible with the screen DC hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight)。 // clean up DeleteDC(hScrDC)。 // bitmap structure BITMAPINFOHEADER bi。 // handle to DIB, temp handle H