ここでは、書籍「アートで魅せる数学の世界」のp.138の図3.39に示してある、放物螺旋(フェルマー螺旋)の糸掛けバージョンとひまわりの種の配置を再現してみました。

放物螺旋×糸掛け

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

M=100,N=9の糸掛けバージョンでの放物螺旋

放物螺旋の式

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

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

ソースコード

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

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

  // 放物螺旋を描画
  stroke(255,0,0);
  drawParabolicSpiral(10.0, 9.0, 100.0, 1000); 
}

// 放物(フェルマー)螺旋を描く関数
void drawParabolicSpiral(
  float a, // 円の半径の初期値
  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 * sqrt(theta) * cos( theta );
    y = a * sqrt(theta) * sin( theta );
    vertex(x,y);
  }
  endShape();
}

ひまわりの種の配置

放物螺旋の糸掛けバージョンを応用すると、ひまわりの種の配置を再現できるようです。

これは\( M=( 1+\sqrt{5} ) / 2, \ \ N=1, \ \ P=1000 \)と、\(M\)を黄金比にとることで実現できます。

ひまわりの種の配置

このひまわりの種の配置についてのソースコードは、放物螺旋の糸掛けバージョンにおいて座標点を線分で結ばずに、単に点を描画していくことになります。

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

  // 放物螺旋状に点を描画
  stroke(0,0,0);
  strokeWeight(6.0);
  drawParabolicSpiral(3.0, 1.0, (1.0+sqrt(5.0))/2.0, 1000); 
}

// 放物(フェルマー)螺旋を描く関数
void drawParabolicSpiral(
  float a, // 円の半径の初期値
  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 * sqrt(theta) * cos( theta );
    y = a * sqrt(theta) * sin( theta );
    point(x,y);
  }
  endShape();
}