ここでは、書籍「アートで魅せる数学の世界」のp.151の図3.62、およびp.152の図3.64に示してある、リサージュ曲線の糸掛けバージョンを再現してみました。

リサージュ曲線×糸掛け

今回再現してみたリサージュ曲線の糸掛けバージョンは以下のような図形になります。

a=3, b=2, M=500, N=61の糸掛けバージョンでのリサージュ曲線
a=1, b=2, M=500, N=367の糸掛けバージョンでのリサージュ曲線
a=3, b=2, M=500, N=373の糸掛けバージョンでのリサージュ曲線
a=7, b=4, M=500, N=457の糸掛けバージョンでのリサージュ曲線

リサージュ曲線の式

リサージュ曲線については、記事「リサージュ図形」で詳しく紹介していますが、ここでは最もシンプルなリサージュ曲線となります。つまり\[ x = R \cos a \theta, \ \ y = R \sin b \theta \]で表されます。今回は糸掛けバージョンとなりますので、\( \theta \to 2 \pi i N / M \)と置き換えて\[ x_i = R \cos ( 2 \pi a i N / M ), \ \ y_i = R \sin ( 2 \pi b i N / M ) \ \ ( i= 0,1,2, \cdots, P) \]として\((x_i,y_i)\)を計算し、順にそれらの座標点を線分で結んでいくことでリサージュ曲線の糸掛けバージョンを描くことができます。

ソースコード

リサージュ曲線の糸掛けバージョンのプログラムのソースコードを示しておきます。

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

  // リサージュ曲線を描画
  background(255,255,255);  
  stroke(255,0,0);
  strokeWeight(0.5);  
  drawLissajous(200.0, 3.0, 2.0, 61.0, 500.0, 500);
}

// リサージュ曲線を描く関数
void drawLissajous(
  float R, // 振幅
  float a, // x軸方向の周波数
  float b, // y軸方向の周波数
  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 = R * cos( a * theta );
    y = R * sin( b * theta );
    vertex(x,y);
  }
  endShape();
}