Houdini學(xué)習(xí)筆記022_Sierpinski三角
上一篇筆記的內(nèi)容對(duì)初學(xué)VEX的人來(lái)說(shuō)可能略顯復(fù)雜了些,干脆我再補(bǔ)寫(xiě)一篇吧。這個(gè)案例是一種經(jīng)典的分形圖案——謝爾賓斯基三角(Sierpinski triangle),它長(zhǎng)下面這樣——

關(guān)于謝爾賓斯基三角的圖案生成有多種方法,這里我選擇的是撒點(diǎn)法。具體來(lái)說(shuō),就是從等邊三角形的三個(gè)點(diǎn)開(kāi)始,任選兩個(gè)點(diǎn)求其中點(diǎn)。然后連接中點(diǎn)和原等邊三角形的任一頂點(diǎn),再求得新的中點(diǎn)。如此不斷循環(huán)往復(fù),所有點(diǎn)的分布就會(huì)呈現(xiàn)上圖中的圖案。
我們可以從一個(gè)Circle節(jié)點(diǎn)開(kāi)始,類(lèi)型選擇Polygon,邊數(shù)設(shè)為3。在視圖窗口按【W(wǎng)】鍵切換為線(xiàn)框顯示。

然后創(chuàng)建Point Wrangle節(jié)點(diǎn),將三角形連接到其第一個(gè)輸入端口。我們先選擇0號(hào)點(diǎn)和1號(hào)點(diǎn),求出其中點(diǎn)作為起始點(diǎn)。獲取點(diǎn)坐標(biāo)的函數(shù)在筆記018中講過(guò):
point(0,"P",@ptnum);
@ptnum這里分別為0和1,得到的兩個(gè)矢量坐標(biāo)分別賦值給變量pos0和pos1,兩者相加后乘以0.5就是中點(diǎn)的坐標(biāo)值。

下面就是不斷求得新的中點(diǎn)的循環(huán)過(guò)程,顯然需要用到for循環(huán)語(yǔ)句。開(kāi)頭的寫(xiě)法為
for(int i=0; i<chi('count'); i++)
別忘了中間加的是分號(hào)。

循環(huán)執(zhí)行的內(nèi)容就是添加點(diǎn),使用的是addpoint函數(shù)。直接寫(xiě)
addpoint(0,pos);
就可以了。然后我們?cè)儆?jì)算新的中點(diǎn)坐標(biāo)。
這里需要從初始三角形的三個(gè)點(diǎn)當(dāng)中隨機(jī)選一個(gè)點(diǎn)出來(lái),使用的是rand函數(shù)。但是rand函數(shù)返回的值是0~1之間的浮點(diǎn)數(shù),可將其乘以3擴(kuò)大到0~3的范圍。再用向下取整函數(shù)floor取值,即可得到0、1、2之中的隨機(jī)一個(gè)值。寫(xiě)法為:
floor(3*rand(seed))
rand函數(shù)的括號(hào)中需要有一個(gè)隨著循環(huán)迭代不斷變化的種子,這樣每次生成的隨機(jī)數(shù)都不同。剛好迭代次數(shù)i就是不斷增加的,可以直接作為隨機(jī)數(shù)的seed。所以最后的VEX代碼如下所示——

Count是我們定義的可調(diào)節(jié)參數(shù),用來(lái)控制總的循環(huán)次數(shù)。在參數(shù)設(shè)置窗口中將其取值范圍設(shè)為0~200000,方法在筆記020中也講過(guò)。

隨著Count值的增加,Sierpinski三角的圖案很快就顯現(xiàn)了出來(lái)。

我們也可以把初始的等邊三角形換成正四面體,得到如下所示的結(jié)果。之所以只有一個(gè)面上有Sierpinski三角的圖案,是因?yàn)槲覀兦笾悬c(diǎn)時(shí)只在0、1、2三個(gè)點(diǎn)中進(jìn)行選擇。如果是正四面體則需要把3號(hào)點(diǎn)也要加進(jìn)來(lái)。

只需要把floor函數(shù)中的3改為4即可。為了不用改來(lái)改去,可以定義一個(gè)num變量,定義:
int num = @numpt;
floor函數(shù)改為floor(num*rand(i))即可。

增加Count的數(shù)值,得到的就是Sierpinski金字塔。

就寫(xiě)到這里吧,下回再見(jiàn)~