
前回のローレンツアトラクタは不思議。しかし初期値を変更しても結局同じような絵で飽きました。今回は値を変更するといろいろ変化が楽しめる?樹木的な図形を描いてみたいと思います。ちょうど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言語、勉強しろよ、自分。




