Posted on 2018/09/04, 6:30 PM By admin22
「形式文法の一種で、植物の成長プロセスを初めとした様々な自然物の構造を記述・表現できるアルゴリズムである。自然物の他にも、反復関数系(Iterated Function System; IFS)のようないわゆる自己相似図形やフラクタル図形を生成する場合にも用いられる。L-System は1968年、ハンガリーユトレヒト大学の理論生物学者にして植物学者であったアリステッド・リンデンマイヤー(Aristid Lindenmayer)により提唱され、発展した。」
https://ja.wikipedia.org/wiki/L-system
説明が難しいのでウィキペデアをそのまま引用させていただきました。
NetLogoの実装がとてもわかりやすかったので、以下サイトのコードを使わせてもらいました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
globals [string rules stack] to setup clear-all reset-ticks ; 初期文字列(axiom)で初期化 set string initial-string ; 書き換えルール ; 空のルールは無視する set rules [] if not empty? rule1 [ set rules lput rule1 rules ] ; スタックを初期化 set stack (list) create-turtles 1 [ hide-turtle set color sky init draw ] end to step set string rewrite string clear-output output-print string clear-drawing ask turtles [ init draw ] tick end to init ; エージェントのコンテキスト pen-up set heading 0 set xcor initial-x set ycor initial-y end to-report rewrite [old-string] let new-string "" repeat length old-string [ ; old-stringの先頭から1文字ずつルールを適用する set new-string word new-string apply-rule first old-string set old-string but-first old-string ] report new-string end ; 1文字に対してルールを適用する ; 適用できるルールがない場合は定数なのでそのまま返す to-report apply-rule [ch] let str ch foreach rules [ ?1 -> let rule ?1 let left-side first rule if ch = left-side [ set str get-right-side rule ] ] report str end ; A -> Bのフォーマットを仮定 ; ->の両側に空白が入る to-report get-right-side [rule] let p position "->" rule report substring rule (p + 3) length rule end ; stringに従って描画 ; エージェントコンテキスト to draw let local-string string repeat length local-string [ let action first local-string set local-string but-first local-string ; 線を描画しながら移動 if action = "F" [ pen-down forward 0.5 ] ; 左折 if action = "+" [ left 90 ] ; 右折 if action = "-" [ right 90 ] ] end |
これを試してみようと思ったきっかけは、フラクタル図形というものがタートルグラフのコマンド(文字)の置き換えで実現できる点が、とても興味深かったからです。(他にも応用がききそうです)
オリジナルコードは角度を変更したりルールが二つありましたが、それがなくても十分複雑図形を得られるので、初期文字列の変更もなしで、まずは慣れるためにいろいろと触ってみました。
これだけシンプルなルールでも、このようなバリエーションが得られます。
ルールを増やしていけば、いろいろな発見ができそうです。
Categories: Graphics タグ: NetLogo