書籍「アートで魅せる数学の世界」のp.156-159で解説されている場合分け型の数列を用いたストリング・アートについて再現を試みています。

場合分け型の数列1

1つ目の場合分け型の数列は以下のようなものです。\[ s_1(i) = \begin{cases} 0 & (i \text{が偶数}) \\ i & (i \text{が奇数}) \end{cases} \]この数列によるストリング・アートは以下のようになります。

場合分け型の数列\(s_1\)によるストリング・アート(M=100、P=1000)

場合分け型の数列2(コラッツ予想)

2つ目の場合分け型の数列は以下のようなものです。\[ s_2(i) = \begin{cases} i/2 & (i \text{が偶数}) \\ 3i+1 & (i \text{が奇数}) \end{cases} \]この数列によるストリング・アートは以下のようになります。

場合分け型の数列\(s_2\)によるストリング・アート(M=500、P=1000)

場合分け型の数列3

2つ目の場合分け型の数列は以下のようなものです。\[ s_2(i) = \begin{cases} ai & (i \text{が3の倍数}) \\ bi & (i \text{が3で割って1余る}) \\ ci & (i \text{が3で割って2余る}) \end{cases} \]この数列によるストリング・アートは以下のようになります。

場合分け型の数列\(s_3\)によるストリング・アート(M=400, a=1, b=2, c=3, P=1000)

ソースコード

場合分け型の数列によるストリング・アートのプログラムのソースコードを示しておきます。

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

  // 場合分け型の数列によるストリング・アートを描画
  background(255,255,255);  

  int P = 1000;
  float[] s3 = makeSequence_s3(1.0, 2.0, 3.0, P);
  
  stroke(0,0,0);
  strokeWeight(0.1);  
  drawSequence(200.0, s3, 400.0, P);
}

// 数列s3を生成する関数
float[] makeSequence_s3(
  float a,
  float b,
  float c,
  int P
){
  float[] s = new float[P+1];
  for(int i=0; i<=P; i++){
    if( i%3 == 0 ){
      s[i] = a*i;
    } else if (i%3 == 1){
      s[i] = b*i;
    } else {
      s[i] = c*i;
    }
  }
  
  return s;
}

// 数列を用いたストリング・アートを描く関数
void drawSequence(
  float R, // 振幅
  float[] s, // 数列
  float M, // 周期
  int P // データ数
){   
  float x, y, theta; 
  beginShape();
  for(int i=0; i<=P; i++){
    theta = 2.0 * PI * s[i] / M;
    x = R * cos( theta );
    y = R * sin( theta );
    vertex(x,y);
  }
  endShape();
}