前回のローレンツアトラクタは不思議。しかし初期値を変更しても結局同じような絵で飽きました。今回は値を変更するといろいろ変化が楽しめる?樹木的な図形を描いてみたいと思います。ちょうど2進木を図形化したような。ただ変化が大きい裏返しでちょっとの変化で計算量が爆発します。設定に注意しないとなかなか帰ってこなくなります。
※「やっつけな日常」投稿順 indexはこちら
スマホの上で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)のまま描いた控え目な「木」がこちら。
-c を1.4としたもの。すこしゴージャス?
-c 1.3 としたもの。かなりゴージャス。でもこのあと 1.1 として戻ってこなくなりました。強制終了。
こちらは -c 1.4 -t 15.0 と細目にしてみたもの。上の感じより上品?
-c 1.3 -t 15.0 としてみたものが以下に。それなりに良い感じ?
そろそろタートルグラフィクスで遊ぶだけじゃなくて、ちゃんとGo言語、勉強しろよ、自分。