斐波那契數列 費馬螺旋 如何在AI畫出向日葵生長規律圖形?
如圖 在AI裡面如何畫出來 知道怎麼畫fibonacci螺旋和黃金分割 也知道fermat 黃金角度為137.5°和費馬螺旋線,費馬螺旋線沒有自己畫,直接找得圖片對著嘗試,但是就是找不到這個圖形的繪製規律,求大師解答。自己實在搞不定 參考網上的教程 但是還是是似而非最開始用黃金矩形確定fibonacci螺旋線的旋轉中心點 但是做出來是這樣的網上有個這樣的解答 用到了費馬的黃金角度,還有也蘊含了斐波那契數列 但是這個螺旋可能沒有用到費馬螺旋吧 還是搞不出最上面的圖形出來
求解 最終目的不是要明白這個數學問題 而是視覺問題 和做出來的方法 謝謝!
我手頭沒有AI,把 [1] 里的 example 9 (processing.js) 修改了一下參數,就生成下圖:
代碼: Edit fiddle - JSFiddle這個問題在 [2] 的第4章有很詳細的論述。
雖然在植物學上,點的數目與 Fibonacci 數列相關,但只要按照 Vogel"s formula [3]:
就可以生成這種模式(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)發現各組原基發散角非常相近,如下圖,非常清楚的指出了原基的規律排布和不相鄰原則。)
所以,繪製圖形時依靠單螺線複製旋轉是不可能得出正確圖形的,使用雙螺線的方式才可以模擬效果,但通過上文的講解,大家也明白了雙螺線也只是視覺上的近似欺騙,圍繞著向日葵原基的成長方式去做才算完美解法。
我們先說雙螺旋的繪製方法。然後是第2種解法,就是嚴格按照黃金夾角和螺線的生長規律來模擬。
1 首先畫一個等分的阿基米德螺線,要層數足夠多。可以畫很多個同心圓,然後半圓錯位得出螺線,不要用AI的「螺旋形工具」,那個是有衰變的,不等分。2 我沒用圓點旋轉黃金角來工作,因為每個圓都要相交螺線上,每個圓都需要手動位移太累。我編輯了一根「圓頭虛線」,如圖,線直接拉伸相交螺線就方便多了,最後轉曲加外框,刪掉直線部分,留下圓頭,附圓頭虛線的「描邊參數」。3 將圓頭虛線圍繞圓心做「旋轉」,每次旋轉137.5°,且讓交匯於螺線,這裡可以使用「動作」面板錄製動作,2個步驟,「旋轉」和「等比縮放」,因為我拉伸都懶得,算好放大比例讓圓頭虛線正好相交螺線就行。4 重複若干5 大約要5百次旋轉跳躍我閉著眼以後。。。圖形才比較飽滿,把虛線展開,只留圓形端頭,適度調整描邊粗細,調整中間的分布,就可以得到真正的向日葵生長圖譜了。事實上我沒真的展開去做,我只知道我能用這兩張方法去解,再不濟照著原圖拼一個,還能用PS的半調圖案模擬出這個來,寫這文章的時間比AI的操作要多。
其一,讓大家了解斐波那契數列數列在自然界的應用,充滿數學美和敬畏之心;其二,了解ADOBE ILLUSTRATOR對此題的解法,解法二類似於暴力破解,其實沒必要去拼體力嘛,按黃金角和阿基米德螺線寫個插件,圖形一鍵成形,甚至是144組正旋 x 233組逆旋的。三大猜想之一四色定理,超級計算機用1200小時100億判斷硬破了,咱不能抬杠,讓數學家們一起去體力破解吧,這種挑戰是無意義的,有意義的事在於你嘗試用更簡潔更美更效率的方法去解決問題。數學也好,設計也好,乃至人生,不外如是。NND,剛來知乎,被一個生僻冷門問題燒了這麼多時間。。。@貘先生早的答案有一些小問題:如果「方法二」的螺線是阿基米德螺線(矢徑正比於轉角),隨著螺線向外,原基尺度逐漸增大,類似晶體原基生長: 隨著螺線向外,原基尺度逐漸增大。
通過軟體作畫,得到[左]下圖,而[右]下圖才是正確的方式,差別在@Milo Yip的回答中,應該選擇矢徑正比於轉角的「開方」張開的費馬螺線:
至於答主所說:雙螺線也只是視覺上的近似欺騙」
其實不然,只要滿足兩個的條件,雙螺線也能得到正確的圖案。
- 正螺線組的組數和反螺線組的組數必須是斐波那契數列中相鄰的兩項。假設有m組正螺線,n組反螺線,將其重疊在一起,相交點就會「派生」出一個m+n組的螺線。按照黃金夾角和螺線的生長規律,給定一條螺線,每隔137.5度取一個點,其實所有點都可以看成另一條(137.5/(360-137.5)=0.618倍「發散速度」的反)螺線與這條螺線的相交點,從1條+1條=2條出發,螺線的組數可以構成斐氏數列。下圖展示了這種「派生」的過程(為了更加直觀,選擇了數列中較大的兩項),左圖紅色點標示13組正螺線中的一條,藍色點標示21組反螺線中的一條(我不是色盲),兩條螺線圍繞圖案中心首尾相接一圈,共有13+21=34個相交點。右圖亮橙色的短線標示了34條「派生」出來的(正)螺旋。
- 正反螺線的發散速度必須匹配(對阿基米德螺線,矢徑正比於轉角,其比例係數係數在此稱為螺線的發散速度)。螺線組數按照1,1,2,3,5,8,13,……「派生」下去,那為什麼需要一個精確的數值(137.5或1.618),而不是任意角度呢?因為只有在137.5度(發散速度比1.618)時,才能使派生的螺線按照方向「正-反-正-反-正-反-正-……」次序排列,再將阿基米德螺線變換成費馬螺線,就可以保證點均勻分布的特性了。
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 圖形光柵化的透視校正問題?