【正文】
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 理學學士學位論文 第一章 分形概論 1 第一章 分形概論 什么是分形 什么是分形呢?很難給分形下一個確切的定義。 因為分形圖形展示的是數學與藝術的成果,它日益受到人們的重視,甚至引發(fā)了分形是不是藝術的討論,隨著時間的流逝,分形是一種 藝術已經為人們所承認,分形與計算機的結合也越來越緊密,計算機圖形學中已經專門引入了分形算法,以生成自然景觀等。本文重點介紹了分形圖形的重要生成算法 —— 逃逸時間算法,并且詳細說明了使用逃逸時間算法生成 Julia集與 Mandelbrot 集的算法過程。可以簡單地說,如果一個對象的部分與整體具有自仿射變換關系,我們就可以 稱它為分形。自分形之父曼德勃羅( Benoit Mandelbrot)在 1975年出版專著《分形對象:形、機遇與維數》,標志著分形理論正式誕生以來。另外,本文也 詳細說明了分形圖形的一種著色方案,它可以使分形圖形的著色過程更富有過渡性,從而使圖形具有更強的美感。另外,分形在其它學科的應用也日益廣泛,可見,分形在今后會得到更大的發(fā)展,有更廣闊的應用空間。 嚴格地而且正式地去定義分形是一件非常復雜而且困難的事情。 分形在英文中為 fractal,是由美籍法國數學家曼德勃羅 (Benoit Mandelbrot)創(chuàng)造出來的。 分形的應用 分形幾何學已在自然界與物理學中得到了應用。這是一種處處連續(xù),但又處處無導數的曲線。 自然界中更大的尺度上也存在分形對象。小于 1 公里的云朵,更受地形概貌影響,大于 1000 公里時,地球曲率開始起作用。學會從實驗 數據測算分維是最近的一大進展。并且由于分形幾何方法的引入,使一些原已死寂的老學科方向煥發(fā)了新的生機,也使一些正蓬勃發(fā)展的新學科獲得了巨大的推動力。并且分形圖形已經開始應用在包裝,服裝,陶瓷裝飾上面。 下面討論 2()f z z? 的一些性質,假設此方程以點 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? 的每一個一次迭代,即 21nnzz? ? ,都會使 z 向靠 0 的方向移動,可以說此時 z 向 0 收斂。 然而,當 0C? 時,它向一個區(qū)域收斂,而不是向一個點收斂,被吸進去的點會遍歷整個區(qū)間,我們稱這個區(qū)間為混沌區(qū)。如圖 所示,假設有一個充分大的整數 N,當未逃逸區(qū)域 M 中的初始點 a 經過小于 N 次迭代就達到未逃逸區(qū)域 M 的邊界,甚至超出了邊界,我們就認為點 a 逃逸出去了;而如果經過 N 次迭代后, a 的軌跡仍未到達 M 的邊界,我們就認為 a 是 A 上的點,用這樣 的 方 法 描 繪 出 A 的 邊 界 圖 形 , 這 就 是 逃 逸 時 間 算 法 的 基 本 思 想 。對所有的點( , ) , 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? ,轉到步驟 ○ 5 。 2, 繪制 Mandelbrot 集:設 Z=x+yi, C=p+qi, C 的取值范圍為: min maxmin max:[ , ]:[ , ]p p pq q q ○ 1 假設繪圖窗口的寬度為 width , 高 度 為 height 。 如果 maxt Time? ,轉到步驟 ○ 5 。 分形圖形著色方案 RGB 色彩模式是工業(yè)界的一種顏色標準,是通過對紅 (R)、綠 (G)、藍 (B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的, RGB 即是代表紅、綠、藍三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統(tǒng)之一。 顏色設置:我們根據逃逸時間算法的循環(huán)次數來給分形圖著色,假定 k 為循環(huán)次數,也就是上面所說的逃逸時間, time 為顏色銳化值, m_nRed, m_nGreen,m_nBlue 為 R, G, B 的初始值,有如下結果: k *= time。 下面對求得的 red, green, blue 三個值進行變換。用計算機語言來表示就是這樣: if ((red amp。 if ((blue amp。運算表示取這三個值的最低九個位, amp。 Julia 集與 Mandelbrot 集圖形的矢量變換 1, Julia 集與 Mandelbrot 集的矢量移動:在逃逸時間算法中,一共有兩個窗口,一個是繪圖窗口,一個是參數窗口,其中繪圖窗口的大小與位置相對來說是固定的,因為它對應的是窗口的分辨率。令 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 代表參數窗口值, oldPoint 表示鼠標移動前的位置, newPoint 表示鼠標移動后的位置。y Mi n = y Mi n y * ( ne wP oi nt .y ol dP oi nt .y ) 。 2, Julia 集與 Mandelbrot 集的矢量放大 :先說明對 Mandelbrot 集的放理學學士學位論文 第二章 分形 相關 理 論 問題 8 大 ,Mandelbrot 集是將參數 C 走遍參數窗口的所有值,經過逃逸時間算法的運算最終在繪圖窗口中畫出圖來,由此可知,參數窗口的大小和位置就決定了所繪 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?? 將這個式子應用到 Julia 集繪制算法中,這里假定繞屏幕的中點旋轉,屏幕的寬度為 width,高度為 height,用坐標表示為 (width/2, height/2),從前面繪制 Julia 集的方法中可知下列兩個步驟: ○ 1 0 min *xx x n x? ? ?, 0 m in *yy y n y? ? ?。圖形的矢量旋轉前后效果對比見圖 與圖 。 ○ B 理學學士學位論文 第二章 分形 相關 理 論 問題 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 計數 i=i+1。 二維元胞自動機生成分形圖案 元胞 分布在二維歐氏幾何平面上規(guī)則劃分的網格點上,則稱它為二維元胞自動機。 ○ 2 對 ( , ) 1iiF x y ? 的點著色。 他們使用了這組方程 : n+ 1 nn+ 1 n+ 1x = b * + f (x ) y = x + f (x ) ny 其中的函數 F(x)是他們所考慮的模型 , 其中一個主要的模型他們使用了 : f ( x) = a * + 2* ( 1 a ) * x* x/ ( 1+x* x) x 其中 a 是一個 參數 , 通常在 1 和 1 之間 , b 是一個非常敏感的常數 , 通常非常接近于 。 ○ 2 進行 計算: z = x 。i = i + 1。 分形圖形的位圖操作 1, 圖形的保存:圖形的保存可以分為三個步驟,先獲取用戶想要將圖形保存為的文件名,然后再將當前客戶區(qū)的圖形拷貝成位圖,最后將位圖寫入文件。要將當前客戶區(qū)域拷貝為位圖,需要先獲取當前窗口的句柄,這個可以使用函數 HWND GetSafeHw nd( ) const。為了拷貝客戶區(qū)的圖形到內存,我寫了一個函數 CopyClientRectToDIB(HWND hander,CRect rect),其中的 hander為當前窗口的句柄, rect 表示客戶區(qū)域的大小。最后將指向位圖的句柄返回。復制圖形區(qū)域為位圖上面我們已經介紹過了,這 里不再贅述,而重畫選定區(qū)域也只需要一個 Rectangle()函數就可以實現。 理學學士學位論文 第二章 分形 相關 理 論 問題 13 GetClientRect(amp。 } } 拷貝客戶區(qū)函數: 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 理學學士學位論文 第二章 分形 相關 理 論 問題 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