阿基米德螺線


見過蚊香嗎?現代年輕一代,可能還真沒看過蚊香,來看看維基上的蚊香照

阿基米德螺線

漩渦形蚊香的路徑就是阿基米德螺線,阿基米德螺線的公式是:

阿基米德螺線

根據公式,Θ 為 0 時的 ra,也就是 a 控制了由內而外的起點位置,若 Θ 為某徑度 radianr1 = 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,弧長本來就會越長,beginShapevertexendShape 是將每個計算得到的點以直線連接,才會越外圈越看得出折線。

這會有什麼問題呢?如果你想在阿基米德螺線上,等距地放上一些字,或者一些圖案,以上的寫法就不適合。

可是我曾經用 OpenSCAD 建立的愛心鏈,看來是用了阿基米德螺線:

阿基米德螺線

看來愛心與愛心之間是等距,這是怎麼辦到的?最簡單的想法當然是,在螺線上每越一段距離,就畫一個愛心,確實地,是可以求得阿基米德螺線的螺線長,搜尋「archimedean spiral arc length」就可以找到公式,例如 Wolfram MathWorld 的 Archimedes' Spiral 就有了:

阿基米德螺線

如果你的點距是固定的 d,只要找出 sd2 * d3 * d 等對應的 Θ,也就是推導出 Θ(s) 的公式就可以了,對吧!嗯!如果無誤差地推導出公式了,請跟我說聲…XD

有時候,如果可以允許一點誤差,事情會好辦一些,對於繪圖或精細度不用要求很高的建模就是如此,至於要怎麼允許一點誤差,就看個別需求。

例如,如果需求只是要繪圖時,「看起來像」等距,假設螺線已經來到 Θ 處:

阿基米德螺線

紅色是螺線,接下來本想將點放到紅色虛線與 (Θ + Θd) 的藍色虛線交接處,不過那個位置不容易計算,想說退一步地,放到綠色圓弧處好了,只要 Θd 別太大,繪製出來的點大致上是看不太出差異的,如果想要的弧長為 d,那麼 d = r * Θd = (b * Θ) * Θd,那麼 可以求得 Θd = d / (b * Θ)

Θd 不會是固定值,每一次新的 Θ' 會等於 Θ + Θd,而新的 r' = b * Θ',來看看繪圖的效果,這次使用畫點的方式,看看點的分佈是不是符合需求:

簡單來說,這是一種近似方式,你也可以採取其他近似方式,最後,來讓圓周率旋轉一下吧!