ここでは、書籍「アートで魅せる数学の世界」のp.137の図3.37右図に示してある、対数螺旋の糸掛けバージョンを再現してみました。
Contents
対数螺旋×糸掛け
今回再現してみた対数螺旋の糸掛けバージョンは以下のような図形になります。
対数螺旋の式
対数螺旋の式は、\[ x(t) = a e^{b \theta} \cos \theta, \ \ y(t) = a e^{b \theta} \sin \theta \]で表されます。今回は糸掛けバージョンとなりますので、\( \theta \to 2 \pi i N / M \)と置き換えて\[ x_i = a e^{2 \pi b i N / M} \cos ( 2 \pi i N / M ), \ \ y_i = a e^{2 \pi b i N / M} \sin ( 2 \pi i N / M ) \ \ ( i= 0,1,2, \cdots, P) \]として\((x_i,y_i)\)を計算し、順にそれらの座標点を線分で結んでいくことで対数螺旋の糸掛けバージョンを描くことができます。
なお、今回は\( M=100, \ \ N=57, \ \ P=1000 \)として描いています。
ソースコード
対数螺旋の糸掛けバージョンのプログラムのソースコードを示しておきます。アルキメデス螺旋と違い、外側に指数的に拡がっていく螺旋となりますので、図形のサイズ調整が多少難しいところがあります。
void setup(){
size(600,600);
translate(width/2.0, height/2.0);
noFill();
// 対数螺旋を描画
stroke(255,0,0);
drawLogarithmicSpiral(1.0, 0.01/2.0/PI, 57.0, 100.0, 1000);
}
// 対数(ベルヌーイ)螺旋を描く関数
void drawLogarithmicSpiral(
float a, // 円の半径の初期値
float b, // 指数の係数
float N, // 糸掛係数
float M, // 周期
int P // データ数
){
float x, y, theta;
beginShape();
for(int i=0; i<=P; i++){
theta = 2.0 * PI * i * N / M;
x = a * exp(b * theta) * cos( theta );
y = a * exp(b * theta) * sin( theta );
vertex(x,y);
}
endShape();
}