pyembroidery/test_fractals.py

82 wiersze
2.4 KiB
Python

import pyembroidery.EmbPattern as EmbPattern
from pyembroidery.EmbConstant import *
import math
def evaluate_lsystem(symbol, rules, depth):
if depth <= 0 or symbol not in rules:
symbol()
else:
for produced_symbol in rules[symbol]:
evaluate_lsystem(produced_symbol, rules, depth - 1)
class Turtle:
def __init__(self, pattern):
self.pattern = pattern
self.angle = 0
self.x = 0
self.y = 0
import math
self.turn_amount = math.pi / 3
def forward(self, distance):
self.x += distance * math.cos(self.angle)
self.y += distance * math.sin(self.angle)
self.pattern.add_stitch_absolute(STITCH, self.x, self.y)
# self.pattern.add_stitch_absolute(SEQUIN_EJECT, self.x, self.y)
def turn(self, angle):
self.angle += angle
def move(self, distance):
self.x += distance * math.cos(self.angle)
self.y += distance * math.sin(self.angle)
def add_gosper(self):
a = lambda: self.forward(20)
b = lambda: self.forward(20)
l = lambda: self.turn(self.turn_amount)
r = lambda: self.turn(-self.turn_amount)
initial = lambda: None
rules = {
initial: [a],
a: [a, l, b, l, l, b, r, a, r, r, a, a, r, b, l],
b: [r, a, l, b, b, l, l, b, l, a, r, r, a, r, b]
}
evaluate_lsystem(initial, rules, 3) # 4
def add_serp(self):
a = lambda: self.forward(20)
b = lambda: self.forward(20)
l = lambda: self.turn(self.turn_amount)
r = lambda: self.turn(-self.turn_amount)
initial = lambda: None
rules = {
initial: [a],
a: [b, l, a, l, b],
b: [a, r, b, r, a]
}
evaluate_lsystem(initial, rules, 3) # 6
def generate(pattern):
turtle = Turtle(pattern);
turtle.add_gosper()
pattern.add_command(COLOR_BREAK)
turtle.move(500)
turtle.add_serp()
pattern.add_command(SEQUENCE_BREAK)
pattern.add_command(STOP)
turtle.move(50)
turtle.add_serp()
pattern.add_command(SEQUENCE_BREAK)
turtle.turn(-math.pi / 3)
turtle.move(500)
turtle.add_serp()
pattern.add_command(COLOR_BREAK)
turtle.turn(-math.pi / 3)
turtle.move(500) # 260, -450
turtle.add_gosper()
pattern.add_command(END)