L-system:Lindenmayer system

2014-12-03 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
6、1、0、2、0、 0、0、0、0、0(41)で、換算ポイント 76pt 。
「グルコサミン」が今朝方トップに。そして、
「Firefox」も又、4位にアップ。
しかし、これまでと一緒で明日朝方には、共にダウンするのでは???
相変わらず「C言語」「Firefox」「化学業界」「グルコサミン」のbg値が、
毎日の如く変動しているから。
・-・ - -・

さて、本文。

先月(2014-11-10)の記事:
Python 学習:タートル・グラフィックス
に関連して、あっちこっち探していたら、・・・

案の定、「フラクタル図形をタートルで描画」が多い。

それで、更に続けていたら、・・・


「人工知能に関する断創録」の 2013-11-26 記事:
L-systemで植物を描く
や、
「memotoxin」の 2013-03-03 記事:
PythonでL-system
などなどが、見つかる。

念のため、ウィキペディアで確認。
L-system
    L-system(エルシステム、Lindenmayer system)は形式文法の一種で、
  植物の成長プロセスを初めとした様々な自然物の構造を
  記述・表現できるアルゴリズムである。
    自然物の他にも、反復関数系(Iterated Function System; IFS)のような
  いわゆる自己相似図形やフラクタル図形を生成する場合にも用いられる。
  L-System は1968年、ハンガリーユトレヒト大学の理論生物学者にして
  植物学者であったアリステッド・リンデンマイヤー
  (Aristid Lindenmayer)により提唱され、発展した。
  ・・・・・

なるほど、
「フラクタル図形」→「L-system」
「フラクタル図形描画」→「turtle」
って感じ???


もう少し学習・・・・・

「人工知能に関する断創録」の 2013-11-25 記事:
L-system入門
・・・なるほど。でも、イマイチ分からない?

更なる検索、・・・
例の「ActiveState Code」の「Rrecipes」に、
L-System Fractals
があった。
ここには、
  L-System fractals.
  I did not use the Turtle graphics module of Python
  because this way is much faster.
とある。
確かに、「Turtle graphics module of Python」は遅い。
でも、敢えて使いたい。
なので、これは眺めるだけ???

他には?
「4D Solutions」の July 8, 2000 記事:
Lsystems in Python
これも勉強になる。
でも、やはり、・・・

「opisthokonta.net」の March 24, 2013 記事:
L-system in Python
これダ!!!

再帰的は方法で、・・・・・
「L-system」の処理系:

def _applyRules(letter, rules):
"""Internal function for applying production rules on a single character."""
try:
return rules[letter]
except:
return letter

def lsystem(init, n, rulesDict):
"""Return the n-th iteration of a L-system (generated recursively)."""

if n <= 0:
return init
if n == 1:
return "".join([_applyRules(i, rulesDict) for i in init])
else:
newCond = "".join([_applyRules(i, rulesDict) for i in init])
return lsystem(newCond, n-1, rulesDict)


そして、利用側:

#Sierpinski triangle example
sierpinskiRules = {"A": "B-A-B",
"B": "A+B+A"}

sierpinskiExample = lsystem("A", 3, sierpinskiRules)
print(sierpinskiExample)


と云ったところ。 ですか?


でも、「4D Solutions」には、

def produce( axiom, rules ):
output = ""
for i in axiom:
output = output + rules.get( i, i )
return output
'''
Notice that the dictionary.get() method takes 2 arguments,
the 2nd being what to return if the 1st is not a key.
For example, if i = 'F', then the rule for 'F' will be invoked,
but if i = '-', then '-' will simply pass through to the growing output string.
'''



と書いてある。
これを使えば、前の(上の)“_applyRules()”関数は不要!?


例によって“<紙>流”=“我流”は!!!

# -*- coding: utf-8 -*-

# 文字(列) S に対して、n 回、ルール RDict を適用
def lsystem( S, n, RDict ):
if n <= 0: return S
if n == 1: return ''.join( [ RDict.get(i,i) for i in S ] )
else:
newS = ''.join( [ RDict.get(i,i) for i in S ] )
return lsystem( newS, n-1, RDict )

# 上記ウィキペディアにある、「例4:コッホ曲線」
Rule = { 'F':'F+F-F-F+F' }
Comm = { 'F':'fd(10)', '+':'lt(90)', '-':'rt(90)' }
GenS = lsystem( 'F', 3, Rule )

# 以下、タートル・グラフィックスで描画
import turtle
turtle.setup( 800, 800 )
ttl = turtle.Turtle()
for S in GenS:
exec 'ttl.'+Comm.get(S)

# 終わっても消さない為
_ = raw_input()



これで、完成(?)
バンザイ! ばんざい!?


本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


141010,12
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
05 | 2017/06 | 07
- - - - 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 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク