分形圖形

分形圖形

分形理論是非線性科學的主要分支之一,它在計算機科學、化學、生物學、天文學、地理學等眾多自然科學和經濟學等社會科學中都有廣泛的套用。分形的基本特徵是具有標度不變性。其研究的圖形是非常不規則和不光滑的已失去了通常的幾何對稱性。在不同的尺度下進行觀測時,分形幾何學卻具有尺度上的對稱性,或稱標度不變性。研究圖形在標度變換群作用下不變性質和不變數對計算機圖形技術的發展有重大的意義。

基本信息

簡介

說到分形(fractal),先來看看分形的定義。分形這個詞最早是分形的創始人曼德爾布諾特提來的,他給分形下的定義就是:一個集合形狀,可以細分為若干部分,而每一部分都是整體的精確或不精確的相似形。分形這個詞也是他創造的,含有“不規則”和“支離破碎”的意思。分形的概念出現很早,從十九世紀末維爾斯特拉斯構造的處處連續但處處不可微的函式,到上個世紀初的康托三分集,科赫曲線和謝爾賓斯基海綿。但是分形作為一個獨立的學科被人開始研究,是一直到七十年代曼德爾布諾特提出分形的概念開始。而一直到八十年代,對於分形的研究才真正被大家所關注。

分形圖形分形圖形
分形通常跟分數維,自相似,自組織,非線性系統混沌等聯繫起來出現。它是數學的一個分支。我之前說過很多次,數學就是美。而分形的美,更能夠被大眾所接受,因為它可以通過圖形化的方式表達出來。而更由於它美的直觀性,被很多藝術家索青睞。分形在自然界裡面也經常可以看到,最多被舉出來當作分形的例子,就是海岸線,源自於曼德爾布諾特的著名論文《英國的海岸線有多長》。

近20年來,分形的研究受到非常廣泛的重視,其原因在於分形既有深刻的理論意義,又有巨大的實用價值。分形向人們展示了一類具有標度不變對稱性的新世界,吸引著人們尋求其中可能存在著的新規律和新特徵;分形提供了描述自然形態的幾何學方法,使得在計算機上可以從少量數據出發,對複雜的自然景物進行逼真的模擬,並啟發人們利用分形技術對信息作大幅度的數據壓縮。它以其獨特的手段來解決整體與部分的關係問題,利用空間結構的對稱性和自相似性,採用各種模擬真實圖形的模型,使整個生成的景物呈現出細節的無窮回歸的性質,豐富多彩,具有奇妙的藝術魅力。分形對像沒有放大極限,無論如何放大,總會看到更詳細的結構。藉助於分形的計算機生成,從少量的數據生成複雜的自然景物圖形,使我們在仿真模擬方面前進了一大步。在分形的諸多研究課題中,分形的計算機生成問題具有明顯的挑戰性,它使傳統數學中無法表達的形態(如山脈、花草等)得以表達,還能生成一個根本“不存在”的圖形世界。分形在製造以假亂真的景物方面的進展和潛在的前途,使得無論怎樣估計它的影響也不過分。可以肯定,分形圖案在自然界真實物體模擬、仿真形體生成、計算機動畫、藝術裝飾紋理、圖案設計和創意製作等具有廣泛的套用價值。

圖形簡介

關於分形與混沌

關於分形的起源,要非常準確的找出來是非常困難的。研究動態系統、非線形數學、函式分析的科學家,已數不勝數。儘管分形的早期線索已非常古老,但這一學科卻還很年輕。比如關於動態系統和細胞自動機的大部分工作可以追溯到馮-諾依曼;但是,直到Mandelbrot才如此清楚地將自然現象和人工現象中的混沌及分形同自相似性聯繫在一起。大家如果對此感興趣,可進一步查閱有關資料。下面我們看一看分形的概念。
什麼是分形呢?考慮到此文的意圖,我們無意給出它嚴格的定義,就我們的目的而言,一個分形就是一個圖象,但這個圖象有一個特性,就是無窮自相似性。什麼又是自相似呢?在自然和人工現象中,自相似性指的是整體的結構被反映在其中的每一部分中。比如海岸線,常舉的例子,你看它10公里的圖象(曲線),和一寸的景象(曲線)是相似的,這就是自相似性。
與分形有著千差萬屢的關係的,就是混沌。混沌一詞來源與希臘辭彙,原意即“張開咀”,但是在社會意義上,它又老愛和無序聯繫在一起。解釋分形和混沌的聯繫,要注意到分形是分離吸引子和排斥吸引子產生的,因此某種意義上說,分形是混沌行為的視覺表現。
看這些東東是不是比較枯燥?呵呵,我也沒辦法給大家弄些美麗的圖片看看---不過你可以到外面走走了,看看天上武漢的雲是不是很漂亮?然後再回來,下一篇我將給大家說一點數學知識,並把我寫的程式拿出來,談談分形的產生。

一點數學知識

怎么樣,武漢的雲還可以嘛!如果你想在計算機上實現它,我想分形法就是最好的選擇。可惜我太菜,武漢的雲也只能記在心中了。如果有誰實現了,請你一定分我一杯羹好嗎?

..
另外,想必女士也不少的,我覺得她們要學習這方面的理論再合適不過。馬克思說女人天生就是美,雖然美天生不是女人:)。她們的感知能力是天生的。再說啦,冷冰凍的系統軟體你不樂意,當然也就花花草草了:)---而且,薪金也不菲嘛!

好啦,不貧啦,言歸正傳,咱們看一看分形的產生。
首先要說明的是,這裡介紹的數學知識,只是為了介紹分形概念的方便。如果你想詳細了解這方面的知識,複變函數、機率、混沌系統等等一系列的東西,你最好去專門看一看。

吸引點和逃離點

這是描述分形產生的基本辭彙。我們考慮這樣一個函式f:

f:R->R
x->f(x)

函式和它自身的複合,比如f,記作f(f(x))。如果你將f再一次作用於結果,則記為f(f(f(x))),這樣你就完成了一個函式f的複合疊代。很顯然,在定義域的某一點上的函式疊代,有可能是發散的或收斂的。使疊代發散的點稱為斥點;然而,如果疊代結果趨於某一個孤立的點,則該點稱為吸引點。在疊代中,兩者都不是的點,就稱為中性點。
下面考察某些疊代函式或疊代幾何過程的所有吸引點的集合。當疊代函式或疊代幾何過程的吸引集是一個無限自相似集(也就是分形,understand?),那么這個吸引集就稱為一個奇異吸引子。

分叉圖

某些實函式的吸引子集合,比如一個簡單的例子:
f(x)=x**2+c//2是冪:)
對於某些實常數c進行函式疊代。假設從c=-1.1,x=0開始,你不妨拿個計數器:),進行疊代。重複作下去,你會發現一個有趣的現象:疊代結果在-1.0左右和0.1左右跳來跳去。如果疊代次數很多,比如200次,並且對一定範圍內不同的c值都這樣做,將會有一個非常美妙的令人驚訝的結果。
到底如何呢?呵呵,關鍵時候,偏要感冒---我可以把每次疊代的結果畫成圖,可惜沒辦法給你分享。---我只能幹吧吧的說,對很多c的取值都這樣做,將會得到一幅圖形,即分叉圖。
了感欣慰的是,後面我將給大家介紹程式的實現。你回去一試,不就ok了?
很顯然,分叉圖是一類簡單而又有趣的分形。套用很多。
Sierpinski三角形

從上面的介紹中,你也許已發現分形產生的一個途徑。另一條途徑就是通過重複進行某個特殊的幾何過程。這類分形叫做疊代函式系統(IFS)。
Sierpinski三角形是一個比較經典的例子。
我只能把它形成的過程說一說了,也不管那百聞不如一見的話。
(1)三角形,取三邊的中點並相互連線---產生四個全等的小三角形;
(2)根據(1)對每一個小三角形如此疊代。
重複一定次數,就會產生一個奇異吸引子,也就是一個分形。
程式實現的技巧後面詳細敘述。
分形是可遞推產生的,我不在詳細說了,比如Cantor集的例子,大家在一般書中應能找的到.我最後想說說IFS變換規則。它在分形算法的描述和程式的實現中非常重要。

疊代函式系統變換

產生Sierpinski三角形和其它一些分形的幾何規則可以用一套包括滑動、伸展和鏇轉在內的運算來進行描述。這類數學運算稱為仿射變換,通常用矩陣運算實現其編程。
如下表,給出了Sierpinski三角形的規則的矩陣編碼形式:

--------1-------2-------3-------4--------5-------6---------機率值-----
1------0.5------0-------0------0.5------25-------1---------0.33------
2------0.5------0-------0------0.5------1--------50--------0.33------
3------0.5------0-------0------0.5------50-------50--------0.33------
如表中d[1,5]的位置是25;表最後一列有特殊的意義,表示這一行所進行的變換將要被用到的可能性或機率。
所謂的變換,到底是如何套用的呢?假設變換是將(x,y)映射到(x’,y’),你
看一看第i行所實施的的變換:
x’=d[i,1]x+d[i,2]y+d[i,5]
y’=d[i,3]y+d[i,4]y+d[i,6]
你就會明白。機率如何套用呢?你看:
i=random(3)+1//在變換之前:)
不行了嗎?
這些東東的套用也許我們都可以掌握,但發現這樣的矩陣,並不是一件簡單的事。我希望有志在這方面有所發展的,都好好找相關的數學理論書好好看一看。不要把時間都花在玩上嘛!書中自有黃金屋,書中自有……:)
下面看分叉圖和Sierpinski三角形的程式實現(delphi6.0)。

程式例子

深入搞圖形圖象,數學還是挺重要的。下面,只是把上次說的數學知識用計算機實現
一下,大家如果回去自己寫一寫,看到那圖案,如果你認為這些事是如此的有趣,立志要深入下去了,我將非常高興。
程式畫出了一個分叉圖,一個Sierpinski三角形(delphi6.0)。在例子中,你要看它們,都是通過操作windows選單,即繪圖函式分別在兩個選單的回響事件中。程式不麻煩,我就不多說了。

..
unitUnit1;

unterface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,Menus,ExtCtrls;
type
TForm1=class(TForm)
MainMenu1:TMainMenu;
Control1:TMenuItem;
picture1:TMenuItem;

exit1:TMenuItem;

Help1:TMenuItem;
Panel1:TPanel;
Image1:TImage;
procedureexit1Click(Sender:TObject);
procedurepicture1Click(Sender:TObject);
procedurepicture2Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Form1:TForm1;
implementation
var
c,x,y,scale:double;
i,j,k,MaxX,MaxY,x1,y1:integer;
d:array[1..6,1..6]ofdouble;
{$R*.dfm}
procedureTForm1.exit1Click(Sender:TObject);
beginclose;
end;
//分叉圖的實現
procedureTForm1.picture1Click(Sender:TObject);
begin
c:=-2.0;
MaxX:=800;
MaxY:=600;
scale:=55.0;
image1.Canvas.Brush.Color:=clwhite;
image1.Canvas.FloodFill(10,10,clgreen,fsBorder);

相關搜尋

熱門詞條

聯絡我們