やっつけな日常(12) スマホでGo! 1.26186…次元から染み出すコッホ曲線

Joseph Halfmoon

スマホの上でGo言語を勉強しております。前回タートルグラフィクスを実装?したので、早速その応用ということで定番?「コッホ」曲線を描いてみましたぞ。フォン・コッホ先生ご考案による有限の面積の中に納まる無限の長さの線であります。フラクタル次元は 1.26186…

※「やっつけな日常」投稿順 indexはこちら

※実機実験はAndroidスマホ上で行っていますが、普通のLinux機あるいはPC上でもそのまま動作すると思います。

コッホ曲線といっても本気で無限を描くわけではございません。無限に細かくしてしまうとスマホが使えない(多分その前にメモリのエラーになるような気がしますが)ので「テキトー」なところで打ち切ってコッホ曲線の雰囲気だけ出す、と。

コッホ曲線を描くGoのソースコード

1の長さのコッホ曲線を描くことは、タートルグラフィクスと再帰があれば簡単です。

    1. 3分の1の長さのコッホ曲線を引く
    2. 60度半時計回りに頭を回す
    3. 3分の1の長さのコッホ曲線を引く
    4. 120度時計回りに頭を回す
    5. 3分の1の長さのコッホ曲線を引く
    6. 60度半時計回りに頭を回す
    7. 3分の1の長さのコッホ曲線を引く

自分の中で自分を呼べば、1.26186…次元という、1次元でも2次元でもない(フラクタル次元というやつだけれども)図形が紡ぎだされます。

例によってAndroidスマホのTermux環境上でソースを開いているところがこちら。短いので一画面に収まります。なお、中でインポートしているturtleモジュールと、ppmモジュールは前回ソース掲載済の自作のもの。

Koch_go

念のため、ソースコードをテキストで貼り付けておきます。

package main

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

func koch(t *turtle.TurtleGraphics, siz float64, smin float64) {
  if siz < smin {
    t.Mov(siz)
  } else {
    koch(t, siz / 3.0, smin)
    t.Rot(60)
    koch(t, siz / 3.0, smin)
    t.Rot(-120)
    koch(t, siz / 3.0, smin)
    t.Rot(60)
    koch(t, siz / 3.0, smin)
  }
}

func main() {
  var img ppm.PpmImage
  XMAX:= 512
  YMAX:= 512
  img.InitPpmImage(XMAX, YMAX, 256)
  var ttl turtle.TurtleGraphics
  ttl.InitTurtleGraphics(48, 256, 36.0, img.Line)
  ttl.Color(255, 0, 128)
  koch(&ttl, 12.0, 0.3)
  img.WritePPM()
}
実機上での実行

前回のディレクトリ配置と go.mod ファイルの設定を使い、実機上で以下のようにすれば結果が得られます。

$ go run koch.go > koch.ppm
$ convert koch.ppm koch.png

ppmファイル形式のままだと画像表示ができないかも知れないので、Imagemagickのconvertコマンドで png 形式に変換してます。

表のAndroidアプリで画像を見たところが以下に。

Result

フラクタル次元、何だかよくわからないが、なんとなくフラクタル。

やっつけな日常(11) スマホでGo!再帰で飛び込む頭山。懐かしのタートルグラフィクス へ戻る

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