斐波那契數列 費馬螺旋 如何在AI畫出向日葵生長規律圖形?

如圖 在AI裡面如何畫出來 知道怎麼畫fibonacci螺旋和黃金分割 也知道fermat 黃金角度為137.5°和費馬螺旋線,費馬螺旋線沒有自己畫,直接找得圖片對著嘗試,但是就是找不到這個圖形的繪製規律,求大師解答。

自己實在搞不定 參考網上的教程 但是還是是似而非

最開始用黃金矩形確定fibonacci螺旋線的旋轉中心點 但是做出來是這樣的

網上有個這樣的解答

用到了費馬的黃金角度,還有也蘊含了斐波那契數列

但是這個螺旋可能沒有用到費馬螺旋吧 還是搞不出最上面的圖形出來

求解 最終目的不是要明白這個數學問題 而是視覺問題 和做出來的方法 謝謝!


我手頭沒有AI,把 [1] 里的 example 9 (processing.js) 修改了一下參數,就生成下圖:

代碼: Edit fiddle - JSFiddle

這個問題在 [2] 的第4章有很詳細的論述。

雖然在植物學上,點的數目與 Fibonacci 數列相關,但只要按照 Vogel"s formula [3]:

egin{align}
phi = n cdot 137.5^circ\
r = c sqrt{n}
end{align}

就可以生成這種模式(pattern)的圖,如5000個點:

如果角度差了0.1~0.2度,很快就會失去這種均勻分布的特性:

在此再次推薦 [2],它是一本很有趣的著作,結合植物學和計算機圖形學,可下載免費的電子版。

[1] Bumgardner, Circles, Spirals and Sunflowers

[2] Prusinkiewicz, Aristid Lindenmayer Przemyslaw, et al. "The Algorithmic Beauty of Plants With." (1990). http://algorithmicbotany.org/papers/abop/abop.pdf

[3] Vogel, Helmut. "A better way to construct the sunflower head." Mathematical biosciences 44.3 (1979): 179-189.


斐波那契數列 + 植物生長規律 + ADOBE矢量軟體AI + 細看還讓人密集跑了,嘖嘖,這問題組合也難怪沒人搭理啊,我來說兩句。~

先了解下向日葵的生長規律:

大自然的機制使得原基的生長遵循著有效率堆排的幾何原理。

一九七九年,數學家伏格(H. Vogel)以電腦模擬原基的生長情形,他用圓點來代表向日葵的原基,在發散角為固定值的假設下,試圖找出最佳的發散角使這些圓點儘可能緊密地排在一起。實驗證明,當發散角小於 137.5 度或大於超過 137.5 度,圓點間都會出現空隙,只以一組螺線陳列。

而發散角等於137.5 度時,清晰的正反兩組螺線疊加出現了,如果要使圓點排列沒有空隙,發散角就必須是黃金角,只有這樣,向日葵花盤最密實、最堅固,能量吸收最有效率。

(將圓周長依黃金比例分割成a b兩段,小弧長b所對應的圓心角約為137.51°稱為黃金角。)

(發散角是指相繼出生的原基按螺線規律排布時的兩兩夾角,晶體學先驅布拉菲兄弟(Auguste and Louise Bravais)發現各組原基發散角非常相近,如下圖,非常清楚的指出了原基的規律排布和不相鄰原則。)

所以,繪製圖形時依靠單螺線複製旋轉是不可能得出正確圖形的,使用雙螺線的方式才可以模擬效果,但通過上文的講解,大家也明白了雙螺線也只是視覺上的近似欺騙,圍繞著向日葵原基的成長方式去做才算完美解法。

我們先說雙螺旋的繪製方法。

斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

這個數列從第二項開始,每一項都等於前兩項之和。

自然界中到處可見斐波那契數列的蹤跡。樹技上的分枝、花的瓣數都是斐波那契數列,百合 3,梅花 5,桔梗常為 8,金盞花 13。。。等等。向日葵也是一樣,前面我們說到了在黃金夾角137.5°的情況下,會出現正反兩組螺線,常見的螺線數目為34組和55組,較大的向日葵的螺線數目則為89組和144組,更大的甚至還有144組和233組。這些全都是費氏數列中相鄰兩項的數值。

就我們要解的題目來看是,正旋21組螺線和逆旋34組螺線,所有的交點就是原基點,第4幅圖中間的分布調整是因為真實的向日葵中間全是細小密布未成長的原基,基於原題的調整。

然後是第2種解法,就是嚴格按照黃金夾角和螺線的生長規律來模擬。

1 首先畫一個等分的阿基米德螺線,要層數足夠多。可以畫很多個同心圓,然後半圓錯位得出螺線,不要用AI的「螺旋形工具」,那個是有衰變的,不等分。

2 我沒用圓點旋轉黃金角來工作,因為每個圓都要相交螺線上,每個圓都需要手動位移太累。我編輯了一根「圓頭虛線」,如圖,線直接拉伸相交螺線就方便多了,最後轉曲加外框,刪掉直線部分,留下圓頭,附圓頭虛線的「描邊參數」。

3 將圓頭虛線圍繞圓心做「旋轉」,每次旋轉137.5°,且讓交匯於螺線,這裡可以使用「動作」面板錄製動作,2個步驟,「旋轉」和「等比縮放」,因為我拉伸都懶得,算好放大比例讓圓頭虛線正好相交螺線就行。

4 重複若干

5 大約要5百次旋轉跳躍我閉著眼以後。。。圖形才比較飽滿,把虛線展開,只留圓形端頭,適度調整描邊粗細,調整中間的分布,就可以得到真正的向日葵生長圖譜了。

附 Nature by Numbers 此視頻對自然界的數學美有形象的詮釋,建議觀看。

事實上我沒真的展開去做,我只知道我能用這兩張方法去解,再不濟照著原圖拼一個,還能用PS的半調圖案模擬出這個來,寫這文章的時間比AI的操作要多。

其一,讓大家了解斐波那契數列數列在自然界的應用,充滿數學美和敬畏之心;其二,了解ADOBE ILLUSTRATOR對此題的解法,解法二類似於暴力破解,其實沒必要去拼體力嘛,按黃金角和阿基米德螺線寫個插件,圖形一鍵成形,甚至是144組正旋 x 233組逆旋的。

三大猜想之一四色定理,超級計算機用1200小時100億判斷硬破了,咱不能抬杠,讓數學家們一起去體力破解吧,這種挑戰是無意義的,有意義的事在於你嘗試用更簡潔更美更效率的方法去解決問題。數學也好,設計也好,乃至人生,不外如是。

NND,剛來知乎,被一個生僻冷門問題燒了這麼多時間。。。


@貘先生早的答案有一些小問題:

如果「方法二」的螺線是阿基米德螺線(矢徑正比於轉角),隨著螺線向外,原基尺度逐漸增大,類似晶體原基生長:

隨著螺線向外,原基尺度逐漸增大。

通過軟體作畫,得到[左]下圖,而[右]下圖才是正確的方式,差別在@Milo Yip的回答中,應該選擇矢徑正比於轉角的「開方」張開的費馬螺線:

至於答主所說:

雙螺線也只是視覺上的近似欺騙」

其實不然,只要滿足兩個的條件,雙螺線也能得到正確的圖案。

  1. 正螺線組的組數和反螺線組的組數必須是斐波那契數列中相鄰的兩項。假設有m組正螺線,n組反螺線,將其重疊在一起,相交點就會「派生」出一個m+n組的螺線。按照黃金夾角和螺線的生長規律,給定一條螺線,每隔137.5度取一個點,其實所有點都可以看成另一條(137.5/(360-137.5)=0.618倍「發散速度」的反)螺線與這條螺線的相交點,從1條+1條=2條出發,螺線的組數可以構成斐氏數列。下圖展示了這種「派生」的過程(為了更加直觀,選擇了數列中較大的兩項),左圖紅色點標示13組正螺線中的一條,藍色點標示21組反螺線中的一條(我不是色盲),兩條螺線圍繞圖案中心首尾相接一圈,共有13+21=34個相交點。右圖亮橙色的短線標示了34條「派生」出來的(正)螺旋。

  2. 正反螺線的發散速度必須匹配(對阿基米德螺線,矢徑正比於轉角,其比例係數係數在此稱為螺線的發散速度)。螺線組數按照1,1,2,3,5,8,13,……「派生」下去,那為什麼需要一個精確的數值(137.5或1.618),而不是任意角度呢?因為只有在137.5度(發散速度比1.618)時,才能使派生的螺線按照方向「正-反-正-反-正-反-正-……」次序排列,再將阿基米德螺線變換成費馬螺線,就可以保證點均勻分布的特性了。

上圖是用MATLAB模擬的結果,圖中縱坐標是發散速度比(已經調整符號)。左圖由兩條發散速度比為黃金分割數倒數(約1.618)的正反單螺線開始「派生」,最終收斂於約2.618。右圖用相同的演算法,不過初始增加了0.0001的偏移,僅僅派到第14組螺線,就與第13組螺線同向了。

用雙螺線繪製,只要參照下表的螺線發散速度比,然後將阿基米德螺線變換成費馬螺線(圖案在徑向上按照根號收縮),就能繪出完全相同的圖案了。

演算法很簡單,沒經過整理,各位將就著看吧

a=zeros(1,20);
b=ones(1,20);
c=ones(1,19);
a(1)=1;a(2)=1;
b(1)=1;b(2)=(sqrt(5)+1)/2;
for i=3:20
a(i)=a(i-1)+a(i-2);
end
for i=3:20
b(i)=b(i-2) + (b(i-1)+b(i-2))*b(i-2)/(a(i-2)*(-b(i-2)/a(i-2)+b(i-1)/a(i-1)));
end

for i=1:19
c(i)=b(i+1)/b(i);
end
plot(c,"r")


不用用AI,估計題主應該是設計師,應該會使用犀牛.

剛好手上有個項目也要做類似效果.

原理,已經有很多答主講了,我著重著實現方法,畢竟題主問的是如何實現.

因為犀牛支持PYTHON腳本,所以給個犀牛實現的方法.然後在犀牛里導出AI格式或者其它矢量格式.
代碼是翻譯Moli Yip 老兄給出的JS代碼,非原創.

#coding=utf-8
import rhinoscriptsyntax as rs
from math import sqrt,pi,cos,sin
width = 70
height = 70
nbr_circles = 250
phi = (sqrt(5) + 1) / 2 - 1
golden_angle = phi * 2 * pi

lg_rad = width * .45;
lg_area = lg_rad ** 2 * pi
sm_area = lg_area / nbr_circles
sm_rad = sqrt(sm_area / pi)
fudge = 0.5
adj_sm_diameter = sm_rad * 2 * fudge
cx = width / 2
cy = height / 2
for i in range(1,nbr_circles):
angle = i * golden_angle
cum_area = i * sm_area
spiral_rad = sqrt(cum_area / pi)
x = cx + cos(angle) * spiral_rad
y = cy + sin(angle) * spiral_rad
#print(x,y)
rs.AddCircle((x,y,0),1)


推薦閱讀:

遊戲里的萬人同屏是如何優化?
你如何看待 Google 推出的新圖形渲染技術 Seurat?
如何評價OpenGL 4.6?
3D 圖形光柵化的透視校正問題?

TAG:Adobe | 數學 | 平面設計 | 圖形 | 計算機圖形學 |