見出し画像

巴山竜来「数学から創るジェネラティブアート」4.3.3 正多角形の再帰的な描画 「ずれ」を「ランダム」にするには??本の図を再現するために試行錯誤

「(高校)数学の可視化」を目標に持つ自分が、巴山竜来「数学から創るジェネラティブアート」を、ゆっくり学んでいく記録です。使用言語はprocessing。プログラミングは超初心者。数学は高校数学+αくらいの知識。

4.3.3 対数らせんとの関係 図4.13の下の二つを実現したい

p.111の図4.13の下の二つは、gon=8(正八角形)でgapをランダムに変更、との記述があるのですが、RecurPolygonのgapをrandomにしてみましたが実現ができませんでした。(下の2行目をrandomにした)

PVector[] vec;  //PVector型の配列を宣言
float gap = 0.1;  //内接する正多角形のずれ
int gon = 8;  //正多角形の頂点の数
void setup(){
  size(500, 500);
  vec = new PVector[gon];
  for(int i = 0; i < gon; i++){ //正多角形の頂点の位置ベクトル
    vec[i] = PVector.fromAngle(2 * i * PI / gon);
    vec[i].mult(width / 2);
  }
}
void draw(){
  translate(width / 2, height / 2); //描画ウィンドウの中心に移動
  drawPolygon(vec);
  vec = getVector(vec);
}
実行するたびに上やこの画像のようにずれの幅がランダムに選ばれ、固定される

確かに、上のプログラムでgapをランダムにというのは、ずれの幅をランダムに設定して、その設定で固定してずらしていく、ということになっているので、実行するたびにずれは違うのですが、1回の実行の中でずれが異なるということ(図はそうなっている)にはならず…

というわけで、呼び出しているPVectorクラスのコード内のgapをrandomにしてみたら、意図しているものに近くなりました。下の5行目、gapをrandom(0.14)にしてあります。

PVector[] getVector(PVector[] v){
  PVector[] nextVec = new PVector[gon];
  for(int i = 0; i < gon; i++){
    PVector dir = PVector.sub(v[(i + 1) % gon], v[i]);
    dir.mult(random(0.14));
    nextVec[i] = PVector.add(v[i], dir);
  }
  return nextVec;
}
これで本の図に近くなりました。実行するたびに異なる図形になります。

randomの値が大きいと印象が異なるだけでなく、図が破綻。

random(1) 螺旋も見えない…
random(5)多角形をずらす描画にはなりませんね。

効果的な可視化には数式を厳密にトレースするだけじゃなくて、randomのような仕組みもコントロールしながら取り入れていくのが大切ですね。そのためにはプログラムの文法や挙動をきちんと理解しておかなければならないと改めて感じることができた試行錯誤でした。

いいなと思ったら応援しよう!

ひるね よろしければ応援お願いいたします。執筆のための資料代として活用させていただきます!