Houdini學(xué)習(xí)筆記037_Mandelbrot Set(曼德勃羅集)

今天的內(nèi)容相對(duì)比較簡(jiǎn)單,我們來(lái)學(xué)習(xí)下面這個(gè)圖案的繪制方法。

這是一個(gè)經(jīng)典的分形圖案,叫做Mandelbrot Set(曼德勃羅集),是由美國(guó)數(shù)學(xué)家Mandelbrot教授發(fā)現(xiàn)的。生成的方式來(lái)自于一個(gè)簡(jiǎn)單的迭代公式:z(n+1) = z(n)^2 + c。其中,z是一個(gè)復(fù)數(shù)(可表示為z = a + bi)。所有使得無(wú)限迭代后的結(jié)果能保持有限數(shù)值的復(fù)數(shù)z的集合(也稱(chēng)該迭代函數(shù)的Julia集)連通的c,構(gòu)成曼德勃羅集(from百度百科)。
最簡(jiǎn)單的生成曼德勃羅集圖案的算法是“escape time”(逃逸時(shí)間)算法。其基本思路是:對(duì)于平面中的初始位置(x, y),不斷進(jìn)行迭代。每次結(jié)果作為下次迭代的初始值。當(dāng)滿(mǎn)足某種條件時(shí),視為“逃逸”發(fā)生,并記錄下迭代的次數(shù)。對(duì)處于Mandelbrot集中的點(diǎn)來(lái)說(shuō),永遠(yuǎn)不可能發(fā)生“逃逸”。所以需要設(shè)定一個(gè)最大迭代次數(shù),當(dāng)達(dá)到這個(gè)迭代次數(shù)還沒(méi)有發(fā)生“逃逸”的點(diǎn),我們就認(rèn)為它是曼德勃羅集中的點(diǎn)。
具體的算法步驟來(lái)源于下面這一段:

在Houdini中,我們可以創(chuàng)建一個(gè)grid(XY平面),設(shè)置其分段為1000×1000(該數(shù)值決定了最終圖案的分辨率)。然后用Point Wrangle節(jié)點(diǎn)對(duì)每個(gè)點(diǎn)進(jìn)行迭代計(jì)算,由于point wrangle是多線(xiàn)程處理的方式,計(jì)算速度還是可以的。
曼德勃羅集圖案的X坐標(biāo)范圍在(-2.00, 0.47),Y坐標(biāo)范圍在(-1.12, 1.12)。因此平面的尺寸和中心位置可設(shè)置如下,確保最終圖案能在平面范圍內(nèi)顯示。

VEX代碼相對(duì)也很簡(jiǎn)單,如下所示:
這里先自定義一個(gè)Mandelbrot函數(shù),得到每個(gè)點(diǎn)的逃逸步數(shù)。逃逸條件為:x*x+y*y < 4。并設(shè)置最大迭代次數(shù)maxIteration,如果達(dá)到這個(gè)次數(shù)還未逃逸,迭代終止。因?yàn)椴淮_定循環(huán)的步數(shù),使用的是while語(yǔ)句。
最終返回的是逃逸發(fā)生時(shí)的迭代步數(shù)iter,如果未逃逸,iter = maxIteration。
對(duì)于grid平面上的點(diǎn),其坐標(biāo)為(@P.x, @P.y)(z方向不考慮)。每個(gè)點(diǎn)都會(huì)返回一個(gè)逃逸步數(shù),變量命名為escapeSteps,并將其賦予col屬性。
用color節(jié)點(diǎn)進(jìn)行著色,Color Type選擇Ramp from Attribute,屬性值Range范圍從0到maxIteration。

當(dāng)maxIteration的值越大時(shí),得到的圖案也會(huì)越精確。

如果想得到像素化風(fēng)格的著色,color的著色對(duì)象Class可改為Primitive,同時(shí)VEX節(jié)點(diǎn)也要用Primitive Wrangle。?如下是250×250的grid平面得到的結(jié)果——

今天的內(nèi)容就到這里,感謝大家的閱讀,國(guó)慶之后再見(jiàn)~