group-telegram.com/compmathweekly/24
Create:
Last Update:
Last Update:
L-системы, или Как нарисовать снежинку и дерево
1.
начнем со слова A и дальше будем итерировать такие замены: A→AB, B→A (на каждой итерации одновременно заменяются все буквы по указанным правилам)
будут получаться всё большие отрезки интересного слова Фибоначчи — про него можно прочитать в статье Вити Клепцына в «Квантике» (№№5-6 за 2020 год)
такого рода правила (“L-системы”) легко реализовать — например, так:
def lsystem(seed,rules,iterations):
for _ in range(iterations):
seed = "".join(
rules[letter] if letter in rules else letter
for letter in seed)
return seed
print(lsystem("A",{"A":"AB","B":"A"},5))
2.
такого рода правила порождают слова с фрактальной структурой… так что можно попробовать превратить их во фрактальные картинки
можно начать, например, со снежинки Коха: мы стартуем с правильного треугольника, а дальше на каждой итерации заменяем каждый отрезок на зубец («_ → _/\_»)
это можно закодировать так:
snowflake = lsystem("F++F++F",{"F":"F-F++F-F"},4)
где “F” означает «идем вперед и рисуем отрезок», а “+” и “-” — изменения направления
(про такое, кстати, тоже писали в «Квантике»: Валя Кириченко и Владлен Тиморин объясняли, как это связано со словом Туэ-Морса и проч.)
осталось это реально нарисовать — например, при помощи matplotlib:
import math
import matplotlib.pyplot as plt
def turtleprint(string,alpha0=0,alpha=90,step=1):
fig = plt.figure()
fig.set_size_inches(6,6)
ax = fig.gca()
ax.set_aspect('equal')
x,y = 0,0
heading = alpha0
for command in string:
if command == "F":
x0,y0 = x,y
x = x0 + step*math.cos(math.radians(heading))
y = y0 + step*math.sin(math.radians(heading))
plt.plot([x0,x],[y0,y],color='k')
if command == "+":
heading += alpha
if command == "-":
heading -= alpha
plt.axis('off')
plt.show()
для 4 итераций получается буквально картинка сверху
можно в таком духе генерировать и, скажем, несамопересекающиеся кривые, приближающиеся к заполнению квадрата — например, вот так:
turtleprint(lsystem("-L",{"L":"LF+RFR+FL-F-LFLFL-FRFR+","R":"-LFLF+RFRFR+F+RF-LFL-FR"},4))
(продолжение следует)
BY Компьютерная математика Weekly
![](https://photo.group-telegram.com/u/cdn4.cdn-telegram.org/file/U9dIQp0xv9XBIPo6CuFx-0KcqyltTBgEfC4NBvfV6qRsfeLZHLrZA0QnPS1l6EGu4Av3Ce3br8dHWpwOqXeij4qvxxSUyzBzTpiD6vUKZu4XN4U_RvBmdaTD9MlTKX3BTaeg5WocrBIAeMpw6hY55HyDK4EdIENnbpagxNJ2LECc4dWZVov6CNmwLW48c1xmZ0Zmtr_oev7J1rkh2-1Tz5Aswd4qECQkFmTYar8gKJWQ2HEo9H8WUmP0pHuygH4tP9vtU5Ti4LrLmkeRvhsaFf-qvD3eFyP8IqrSeyy4h1NiH9sBsoduSkrOb6ZiNQbYfQVWJZlnLv-rzdaOVtM49A.jpg)
Share with your friend now:
group-telegram.com/compmathweekly/24