やっつけな日常(14) スマホでGo!パラメータを変えると飽きない2分木?を描く。

Joseph Halfmoon

前回のローレンツアトラクタは不思議。しかし初期値を変更しても結局同じような絵で飽きました。今回は値を変更するといろいろ変化が楽しめる?樹木的な図形を描いてみたいと思います。ちょうど2進木を図形化したような。ただ変化が大きい裏返しでちょっとの変化で計算量が爆発します。設定に注意しないとなかなか帰ってこなくなります。

スマホの上でGo言語を学んでいる筈が、Goの勉強にはならず、タートルグラフィクスに戯れるだけになってます、このところ。GWだし、まあ、いいか。

今回実験に使用したGoソース

今回実験に使用したソースは、前々回にコッホ曲線を描くのに使ったソースの使い回しです。手抜き。使用のlocalモジュールのソースは前回と同じです。

package main

import (
  "flag"
  "fmt"
  "local/turtle"
  "local/ppm"
)

func tree(t *turtle.TurtleGraphics, siz float64, fc float64, th float64, smin float64) {
  if siz < smin {
    return
  } else {
    t.Mov(siz)
    t.Rot(th)
    tree(t, siz / fc, fc, th, smin)
    t.Rot(-2.0*th)
    tree(t, siz / fc, fc, th, smin)
    t.Rot(th)
    t.Rot(180.0)
    t.Mov(siz)
    t.Rot(180.0)
  }
}

func main() {
  fc      := flag.Float64("c", 1.5, "Ratio")
  th      := flag.Float64("t", 30.0, "Theta")
  fnam    := flag.String("f", "treeX_default.ppm", "PPM file name")
  verbose := flag.Bool("v", false, "verbose flag")
  flag.Parse()
  var img ppm.PpmImage
  XMAX:= 512
  YMAX:= 512
  img.InitPpmImage(XMAX, YMAX, 256)
  img.Verbose = *verbose
  var ttl turtle.TurtleGraphics
  ttl.InitTurtleGraphics(256, 500, 10.0, img.Line)
  ttl.Color(255, 0, 128)
  ttl.Rot(90.0)
  tree(&ttl, 10.0, *fc, *th, 0.2)
  if img.FwritePPM(*fnam) {
    fmt.Println("Success.")
  } else {
    fmt.Println("PPM file genaration, failed.")
  }
}
描ける図形の例

図形は、2つのコマンドライン引数で形状がいろいろ変化します。

    • -c 枝から葉に向かって縮小していく比率を設定
    • -t 枝に対して葉が出る角度を設定

なお、-c を1.0 に近い値、例えば1.1 などとすると戻ってこなくなるかもしれません。また、1.0以下になると正常には戻りません。

無指定時のデフォルト値(-c 1.5 -t 30.0)のまま描いた控え目な「木」がこちら。

test15_30

-c を1.4としたもの。すこしゴージャス?

test14_30

-c 1.3 としたもの。かなりゴージャス。でもこのあと 1.1 として戻ってこなくなりました。強制終了。

test13_30

こちらは -c 1.4 -t 15.0 と細目にしてみたもの。上の感じより上品?

test14_15

-c 1.3 -t 15.0 としてみたものが以下に。それなりに良い感じ?

test13_15

そろそろタートルグラフィクスで遊ぶだけじゃなくて、ちゃんとGo言語、勉強しろよ、自分。

やっつけな日常(13) スマホでGo!じゃない。全てを引き込むローレンツアトラクタ へ戻る

やっつけな日常(15) スマホでGo!じゃない。ヒルベルト曲線 へ進む