見過蚊香嗎?現代年輕一代,可能還真沒看過蚊香,來看看維基上的蚊香照:
漩渦形蚊香的路徑就是阿基米德螺線,阿基米德螺線的公式是:
根據公式,Θ
為 0 時的 r
是 a
,也就是 a
控制了由內而外的起點位置,若 Θ
為某徑度 radian
,r1 = a + b * angle
,轉一圈後 r2 = a + b * (angle + 2 * PI)`
,r2 - r1 = 2 * PI * b,也就是從螺線起點、任意角往外畫一直線,與螺線任兩個的連續交點,距離一定是固定的
2 * PI * b`。
那麼製作蚊香時,是依公式在轉動鋪料上去的嗎?這太麻煩了!只要等角速度轉動圓盤,然後直線地以等速由內往外鋪料就可以了,因為從公式來看,Θ
的角速度相同,r
的增加速度也就相同,這就是阿基米德螺線也被稱為等速螺線的原因。
有公式的話,要畫螺線基本上不是難事,若 a
為 0,可以畫出以下的螺線:
喂!不是要畫阿基米德螺線嗎?怎麼畫出來的像是折線?而且還越往外越長?這是因為 theta
的增量故意設較大的原因,如果你只是要畫螺線,不希望看來像折線,theta
的增量設小一些就可以了,例如設為 0.1,就目前的繪圖大小而言,就應該不會看來像折線了。
然而,如果你的繪圖區夠大,螺線圈數夠多,其實到一定的圈數之後,還是會看來像個折線,這是因為程式中theta
的增量是固定的,螺線圈數越多,r
越大,固定的轉動 theta
,弧長本來就會越長,beginShape
、vertex
、endShape
是將每個計算得到的點以直線連接,才會越外圈越看得出折線。
這會有什麼問題呢?如果你想在阿基米德螺線上,等距地放上一些字,或者一些圖案,以上的寫法就不適合。
可是我曾經用 OpenSCAD 建立的愛心鏈,看來是用了阿基米德螺線:
看來愛心與愛心之間是等距,這是怎麼辦到的?最簡單的想法當然是,在螺線上每越一段距離,就畫一個愛心,確實地,是可以求得阿基米德螺線的螺線長,搜尋「archimedean spiral arc length」就可以找到公式,例如 Wolfram MathWorld 的 Archimedes' Spiral 就有了:
如果你的點距是固定的 d
,只要找出 s
為 d
、2 * d
、3 * d
等對應的 Θ
,也就是推導出 Θ(s)
的公式就可以了,對吧!嗯!如果無誤差地推導出公式了,請跟我說聲…XD
有時候,如果可以允許一點誤差,事情會好辦一些,對於繪圖或精細度不用要求很高的建模就是如此,至於要怎麼允許一點誤差,就看個別需求。
例如,如果需求只是要繪圖時,「看起來像」等距,假設螺線已經來到 Θ
處:
紅色是螺線,接下來本想將點放到紅色虛線與 (Θ + Θd)
的藍色虛線交接處,不過那個位置不容易計算,想說退一步地,放到綠色圓弧處好了,只要 Θd
別太大,繪製出來的點大致上是看不太出差異的,如果想要的弧長為 d
,那麼 d = r * Θd = (b * Θ) * Θd
,那麼 可以求得 Θd = d / (b * Θ)
。
Θd
不會是固定值,每一次新的 Θ'
會等於 Θ + Θd
,而新的 r' = b * Θ'
,來看看繪圖的效果,這次使用畫點的方式,看看點的分佈是不是符合需求:
簡單來說,這是一種近似方式,你也可以採取其他近似方式,最後,來讓圓周率旋轉一下吧!