3

問題文は次のとおりです。

「アルファベットセット、公理、一連の書き換え規則、およびアルファベットセットを使用した全単射の一連の幾何学的規則を備えたLシステムが与えられた場合、反復関数システム(IFS)変換の同等のセットをどのように見つけますか(これは含まれますが、使い尽くすことはありません - 平行移動、回転、およびスケーリング)?"

大まかに言えば、L-System は文字書き換えシステムであり、最初の文字列 (公理) から始めて、書き換え規則に従って文字を変更していきます。幾何学的な解釈を与えるために、描画の要素を関連付けることができ、それによって図が得られます。

これは、Turtle を使用して Koch 曲線を生成する L システムの Python 実装です。

import time
from turtle import *
from progress.bar import Bar


def Lrule(s):
    s2 = ''
    for i in range(len(s)):
        if s[i] == '>':
            s2 += '>+>-->+>' #rewriting rule
        else:
            s2 += s[i]
    return s2

def stringConstruct(n):
    axiom = '>' #initial string
    b = Bar('Creating string',fill = '=',max = n)
    for i in range(n):
        axiom = Lrule(axiom)
        b.next()
    return axiom

def drawit(distance,angle,n):
    s = stringConstruct(n)
    d = distance

    wn = Screen()
    t = Turtle()
    t.penup()
    t.back(700)
    t.right(90)
    t.forward(300)
    t.left(90)
    t.pendown()
    t.speed(0)

    for cmd in s:
        if cmd == '>':
            t.forward(d)
        elif cmd == '+':
            t.left(angle)
        elif cmd == '-':
            t.right(angle)
    wn.exitonclick()


if __name__ == '__main__':

    drawit(distance=5, angle=60, n=10)

IFS は、ポイントを別のポイントに取り、変換のアトラクタ セットを近似しようとする縮小マッピングまたは変換のセットです。

コッホ曲線を生成する IFS の Python 実装をここに示します。まくら図書館を使って絵として表現しています。

import random
from PIL import Image
from progress.bar import *
class snowflake(object):
    def __init__(self, img_width, img_height, paint_color=(19, 150, 100),
                 bg_color=(255, 255, 255)):
        self.img_width, self.img_height = img_width, img_height
        self.paint_color = paint_color
        self.x, self.y = 0, 0
        self.age = 0

        self.koch = Image.new('RGB', (img_width, img_height), bg_color)
        self.pix = self.koch.load()
        self.pix[self.scale(0, 0)] = paint_color


    def scale(self, x, y):
        h = (x)*(self.img_width-1)
        k = (0.7-y)*(self.img_height-1)
        return h, k

    def transform(self, x, y): #set of transformations
        rand = random.uniform(0, 100)#to make it more faster
        if rand < 25:
            return x/3, y/3
        elif 25 <= rand < 50:
            return (x-y*3**0.5+2)/6, (y+x*3**0.5)/6
        elif 50 <= rand < 75:
            return (x+y*3**0.5+3)/6, (y-x*3**0.5+3**0.5)/6
        else:
            return (x+2)/3, y/3

    def iterate(self, iterations):
        self.b = ChargingBar('Creating string',max = iterations, suffix='%(percent)d%%')
        for _ in range(iterations):
            self.b.next()
            self.x, self.y = self.transform(self.x, self.y)
            self.pix[self.scale(self.x, self.y)] = self.paint_color
        self.age += iterations

koch = snowflake(1080, 1080)
koch.iterate(200000)
koch.koch.show()

1 週間続けた結果、次の結論が得られました。

  • 一連の描画ルールを持つ L システムが与えられた場合、そのような一連の変換は常に存在します。

しかし、これは存在を証明する以外には役に立ちません。

同じフラクタルを生成するために、Python で L-Systems と IFS を別々にコーディングしましたが、相互の関係はまだ不明です。

描画ルールを使用して L システムが与えられた場合に、IFS を知る (または生成する) アルゴリズムを生成することは可能ですか? はいの場合、それは行われましたか?それは何ですか? いいえの場合、なぜそれが不可能なのですか?

4

0 に答える 0