1. ホーム
  2. Processingの使い方
  3. 縮小していく線分を描く

ここでは、下図のように線分が少しずつ縮小して最終的には1点に収束していくような線の描画を考えます。

縮小していく線分

縮小比率を計算する

このような、線分が少しずつ縮小して1点に収束するような線を描くために、隣り合った線分の比(縮小比率)を計算する必要があります。これは等比数列の計算をすれば簡単に求まります。

上図のように、描く線の長さを\(l\)、一番長い線分(図では一番右の線分)の長さを\(s\)とし、縮小比率を\(r\)とおきます。このとき、この縮小を無限回繰り返すと、

\[ l = \sum_{n=0}^{\infty} s r^{n} = \frac{s}{1-r} \]

が成り立ちます。したがって、縮小比率\(r\)は

\[ r = 1 – \frac{s}{l} \]

で計算することができます。

縮小していく線分を描く関数

参考に、上図に表した、縮小していく線分を描くプログラムの例を示しておきます。while文の中身を変えることでいろいろと応用することができます。

void drawShrinkSegments(
  float line_len, // 線全体の長さ(収束点からの長さの初期値)
  float segment_len_initial, // 線分の長さの初期値
  float ratio // 線分の縮小比率
  ){

  float x; // 収束点からの長さ
  float segment_len; // 線分の長さ
  
  x = line_len;
  segment_len = segment_len_initial;

  float x1, y1, x2, y2, x3, y3, x4, y4;
  int i = 0;  
  while(i<100){  
    x1 = x;
    y1 = 5.0;
    x2 = x - segment_len;
    y2 = 5.0;
    x3 = x2;
    y3 = -y2;
    x4 = x1;
    y4 = -y1;
  
    noStroke();
    if (i % 2 == 0){
      fill(0,0,0);
    } else {
      fill(255,255,255);
    }
    pushMatrix();
    beginShape();
    vertex(x1,y1);
    vertex(x2,y2);
    vertex(x3,y3);
    vertex(x4,y4);
    endShape(CLOSE);
    popMatrix();
    
    x = x - segment_len; // 収束点からの長さを更新
    segment_len = segment_len * ratio; // 線分の長さを更新
    i++;
  }
}

この関数の使い方としては、以下のようになります。

void setup() {
  size(1000, 100);
  
  noStroke();
  translate(width/4, height/2);

  float line_len = width/2.0; // 線全体の長さ(収束点からの長さの初期値)
  float segment_len_initial = width/10.0; // 線分の長さの初期値
  float ratio = 1.0 - segment_len_initial / line_len; // 線分の縮小比率
  
  drawShrinkSegments(line_len, segment_len_initial, ratio); // 収束点に向かって縮小していく線分を描画

}

コメントを残す