自然景物在外部形態(tài)上呈現(xiàn)出千姿百態(tài),其生長都具有一定的盲目性,但是分枝模式總有規(guī)律可循,對這些結(jié)構(gòu)進(jìn)行具體的放大會發(fā)現(xiàn)不規(guī)則程度是一樣的,即他們的自相似性。分形以其獨(dú)特的手段來解決不規(guī)則形態(tài)物體的仿真問題,利用空間結(jié)構(gòu)的對稱性和自相似性,可以將自然界中絕大多數(shù)的非規(guī)則圖形真實(shí)地在計(jì)算機(jī)上再現(xiàn)。自然界中大多數(shù)樹木和草的分叉結(jié)構(gòu)都具有分形的性質(zhì),為計(jì)算機(jī)分形模擬提供了基礎(chǔ)。據(jù)此如何真實(shí)地描述竹子的生長變化過程,本文在算法及實(shí)現(xiàn)上做了一些研究。
分形作為一種方法,在圖形學(xué)領(lǐng)域主要是利用迭代、遞歸等技術(shù)來實(shí)現(xiàn)某一具體的分形構(gòu)造。它的主要任務(wù)是以分形幾何學(xué)為數(shù)學(xué)基礎(chǔ),構(gòu)造非規(guī)則的幾何圖素,從而實(shí)現(xiàn)分形體的可視化,以及對自然景物的逼真模擬。
植物的分形模擬就是基于分形理論的植物形態(tài)模擬,其原理是利用植物自身結(jié)構(gòu)的分形性質(zhì)(結(jié)構(gòu)的自相似性)生成植物圖形或圖像的方法。當(dāng)前,分形植物模擬的方法主要有L-系統(tǒng)、迭代函數(shù)系統(tǒng)(Iterated Function System,IFS)、受限擴(kuò)散凝聚(Diffusion Limited Aggregation,DLA)模型和粒子系統(tǒng)。這四種方法的算法原理互不相同,模擬對象也是各有側(cè)重。
迭代函數(shù)系統(tǒng)是從一個(gè)坐標(biāo)系到另一個(gè)坐標(biāo)系的映射系統(tǒng),其算法分為確定性算法和隨機(jī)性算法。
確定性算法是指用以迭代的規(guī)則是確定性的,它們由一組仿射變換(如R1,R2,R3等)構(gòu)成。隨機(jī)性的算法,又被人們稱為混沌游戲,指迭代過程是不確定的,每一次迭代采用哪一個(gè)規(guī)則,即Ri(i=1∽N)中具體哪一個(gè),不是預(yù)先定好的,而是類似靠擲骰子的辦法來決定。也既是說,隨機(jī)地從Ri(i=1∽N)中選一個(gè)迭代規(guī)則迭代一次,再從Ri(i=1∽N)中選一個(gè)迭代一次,依此類推,那么最終的生成圖形是Ri(i=1∽N)中各個(gè)迭代規(guī)則的并集。令最終生成的圖形為M,它要滿足如下集合關(guān)系:M=R1∪R2∪…∪RN。
數(shù)學(xué)上的仿射變換是一種由旋轉(zhuǎn)、平移、映射構(gòu)成的變換,仿射變換可以由一個(gè)函數(shù)來表示,這也正是命名“迭代函數(shù)系統(tǒng)”的原因。簡單地說,迭代函數(shù)系統(tǒng)就是指把仿射變換函數(shù)系統(tǒng)經(jīng)過多次迭代形成的分形。
雖然植物在外部形態(tài)上呈現(xiàn)出千姿百態(tài),但是植物的分枝模式總是有規(guī)律可循的,外部形態(tài)是其內(nèi)部某種形態(tài)控制機(jī)制的反映,而外部形態(tài)是可以用植物的分枝模式來描述的。植物的分枝模式分2種,單軸分枝模式和合軸分枝模式。
單軸分枝模式。頂芽不斷向上生長,形成主干。同時(shí)側(cè)芽也發(fā)展成為側(cè)枝,側(cè)枝又以同樣方式形成次級側(cè)枝,但側(cè)枝不及主干粗、長。這種分枝模式有明顯的主軸,稱為單軸分枝模式,單軸分枝的主干上能產(chǎn)生各級分枝,主干的伸長和粗細(xì)比側(cè)枝強(qiáng)得多。因此這種分枝模式主干特征顯著,如竹子、松樹、云杉、楊樹等。
合軸分枝模式。頂芽發(fā)育一定時(shí)期后死亡或生長緩慢,而位于頂芽下面的側(cè)枝就取而代之,繼續(xù)發(fā)育,形成強(qiáng)壯的側(cè)枝,連接在原來的主軸上。之后,這種側(cè)枝上的頂芽又停止發(fā)育,再由它下面的側(cè)芽來代替,便形成了彎曲的主軸。以這種方式分枝植物的地上部分呈開放狀態(tài),典型的如柳樹、榆樹等等。
前文提到竹子的生長變化屬于單軸分枝模式。本文采用的分形算法為:以一個(gè)竹干作為單位來向上依次遞歸形成竹子,如圖1所示。假設(shè)最接近地面的那一段竹干AB長為L,并且與地面夾角為a,兩側(cè)枝CD、BE與主干的夾角皆為b,側(cè)枝與主干的長度比例為s2。其中主干起點(diǎn)A(x,y),主干終止和右側(cè)枝起點(diǎn)B(x2,y2),右側(cè)枝終點(diǎn)E(x2R,y2R),左側(cè)枝起點(diǎn)C(x1,y1)以及左側(cè)枝終點(diǎn)D(x1L,y1L)。
主要步驟如下:
(1)繪制主干AB,即用畫筆描繪曲線(x2,y2)-(x,y);
主干終止B點(diǎn)坐標(biāo)
x2=x+L*cos(a*Pi),
y2=y+L*sin(a*Pi);
右側(cè)枝終止E點(diǎn)坐標(biāo)
x2R=x2+L/s2*cos((a+b)*Pi),
y2R=y2+L/s2*sin((a+b)*Pi);
圖1 竹干生成的坐標(biāo)數(shù)據(jù)
圖2 左側(cè)枝中間葉子生成
左側(cè)枝開始C點(diǎn)坐標(biāo)
x1=x+L/s2*cos(a*Pi),
y1=y+L/s2*sin(a*Pi);
左側(cè)枝終止D點(diǎn)坐標(biāo)
x1L=x1+L/s2*cos((a-b)*Pi),
y1L=y1+L/s2*sin((a-b)*Pi);
(2)用畫筆畫出第一節(jié)竹干以及兩邊側(cè)枝的模型,然后將B點(diǎn)坐標(biāo)作為A點(diǎn)重新計(jì)算出第二節(jié)竹節(jié)的各個(gè)側(cè)枝起點(diǎn)以及終點(diǎn)坐標(biāo),再用畫筆繪圖函數(shù)完成第二節(jié)竹干的繪制,算是一次遞歸過程。竹干的生成用到了Graphics類庫里面的畫筆描繪:
●竹干畫筆寬度以及繪制竹干
gg.setStroke(new BasicStroke(6));
ig.drawLine((int)x,(int)y,(int)x2,(int)y2);
●側(cè)枝畫筆寬度以及繪制側(cè)枝
gg.setStroke(new BasicStroke(2));
ig.drawLine((int)x2,(int)y2,(int)x2R,(int)y2R);
ig.drawLine((int)x1,(int)y1,(int)x1L,(int)y1L);
位于側(cè)枝上的葉子也采用了類似的算法,以左側(cè)枝中間的葉子為例,其他的側(cè)枝葉子可以由此遞歸、迭代產(chǎn)生:
以一個(gè)多邊形來描繪一片葉子,如圖2所示。
假設(shè)左側(cè)枝終點(diǎn)作為該葉子的起點(diǎn),葉子的終點(diǎn)設(shè)為(xLLeafEnd,yLLeafEnd),葉子的長度與主干的長度比值0.4,葉子中間突起兩點(diǎn)坐標(biāo)分別為(xLLeafLCenter,yLLeafLCenter)和(xLLeafRCenter,yLLeafRCenter)。
左邊葉子的終點(diǎn)坐標(biāo)
xLLeafEnd=x1+(L/s2+L*0.4)*cos((ab)*Pi);
yLLeafEnd=y1+(L/s2+L*0.4)*sin((ab)*Pi);
左邊葉子的中間突起的兩點(diǎn)坐標(biāo)
xLLeafLCenter=x1L+L*0.2*cos((ab)*Pi)/2;
yLLeafLCenter=y1L;
xLLeafRCenter=x1L;
yLLeafRCenter=y1L+L*0.2*sin((ab)*Pi)/2;
算出竹葉的4個(gè)點(diǎn)之后就通過繪制、填充多邊形來達(dá)到竹葉的繪制效果。
葉子的填充用到了Graphics中的多邊形繪制以及色彩填充,具體代碼如下:
Polygon pointleft=new Polygon();
pointleft.addPoint((int)x1L,(int)y1L);
pointleft.addPoint((int)xLLeafRCenter,(int)yLLeafRCenter);
pointleft.addPoint((int)xLLeafE-nd,(int)yLLeafEnd);
pointleft.addPoint((int)xLLeafLC-enter,(int)yLLeafLCenter);
這樣就可以完成第一個(gè)竹干以及葉子的繪制,上層的竹干可以由第一節(jié)竹干遞歸、迭代生成。
根據(jù)竹子的分枝模式,可以采用迭代函數(shù)系統(tǒng)中確定性算法與隨機(jī)性算法相結(jié)合的方法動態(tài)模擬竹林生長的各種形態(tài),如竹節(jié)生長、葉子生長直至樹葉枯黃掉落。實(shí)驗(yàn)利用Java語言的GUI圖形用戶界面設(shè)計(jì)與AWT畫圖雙緩沖,輕松地的完成繪制主干及分支、樹葉以及根據(jù)生長周期設(shè)置樹葉顏色變化直至枯黃掉落。此外利用畫筆直接描繪出竹干,以及設(shè)計(jì)一個(gè)生長速率變量來控制程序的遞歸、迭代速度,從而控制竹子的生長速度。在模擬過程中,引入了雙緩沖技術(shù)對生長動畫的描繪,可以讓整個(gè)生長過程沒有出現(xiàn)閃爍,圖像更流暢。
實(shí)驗(yàn)的難點(diǎn)在于分形圖形算法的構(gòu)造即如何將竹林的生長模式轉(zhuǎn)化成算法來編寫程序?qū)崿F(xiàn),本文采用分形算法中的L-系統(tǒng),并且在具體應(yīng)用中加以適當(dāng)改進(jìn),實(shí)驗(yàn)表明技術(shù)是可行的,實(shí)現(xiàn)方法的效果也是良好的。
本文的生長模式固定,即每一次生長的圖形一樣,下一步將進(jìn)一步研究自然性,即分支產(chǎn)生的隨機(jī)分支偏轉(zhuǎn)角度的隨機(jī)性。
[1]陳曉,彭國華,楊康.基于分形L系統(tǒng)生成三維景物的算法研究[J].計(jì)算機(jī)仿真,2009,07.
[2]劉振興.基于功能-結(jié)構(gòu)和L-系統(tǒng)的植物仿真建模[D].天津:天津工業(yè)大學(xué)學(xué)報(bào),2008.
[3]羅燕,吳中福,郭選昌,吳剛.分形算法的仿真“竹”的實(shí)現(xiàn)[J].重慶:重慶大學(xué)學(xué)報(bào),2010,33(12).
[4]孫博文.分形算法與程序設(shè)計(jì)——Java實(shí)現(xiàn)[M].北京:科學(xué)出版社,2004,11.
[5]Lindenmayer,A Mathematical models for cellular interaction in development,Journal of Theoretical Biology,1996:280-315.
[6]孫永香,劉彤,鄭永果等.虛擬植物的建模方法[J].系統(tǒng)仿真學(xué)報(bào),2006,18(6):0263-04.