ここでは、書籍「アートで魅せる数学の世界」のp.137の図3.37左図に示してある、アルキメデス螺旋の糸掛けバージョンを再現してみました。

アルキメデス螺旋×糸掛け

今回再現してみたアルキメデス螺旋の糸掛けバージョンは以下のような図形になります。

M=199,N=33の糸掛けバージョンでのアルキメデス螺旋

アルキメデス螺旋の式

アルキメデス螺旋の式は、\[ x(t) = (a \theta + b) \cos \theta, \ \ y(t) = (a \theta + b) \sin \theta \]で表されます。今回は糸掛けバージョンとなりますので、\( \theta \to 2 \pi i N / M \)と置き換えて\[ x_i = (2 \pi a i N / M + b) \cos ( 2 \pi i N / M ), \ \ y_i = (2 \pi a i N / M + b) \sin ( 2 \pi i N / M ) \ \ ( i= 0,1,2, \cdots, P) \]として\((x_i,y_i)\)を計算し、順にそれらの座標点を線分で結んでいくことでアルキメデス螺旋の糸掛けバージョンを描くことができます。

なお、今回は\( M=199, \ \ N=33, \ \ P=1000 \)として描いています。

ソースコード

アルキメデス螺旋の糸掛けバージョンのプログラムのソースコードを示しておきます。

void setup(){
  size(500,500);
  translate(width/2.0, height/2.0);
  noFill();

  // アルキメデス螺旋を描画
  stroke(0,0,255);
  drawArchimedeanSpiral(1.0 / 2.0 / PI , 0.0, 33.0, 199.0, 1000); 
}

// アルキメデス螺旋を描く関数
void drawArchimedeanSpiral(
  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 * theta + b) * cos( theta );
    y = (a * theta + b) * sin( theta );
    vertex(x,y);
  }
  endShape();
}