[Занимательные задачки, Python, Программирование, Математика] L-системы и что они себе позволяют

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
30-Янв-2021 18:31

Давайте начнём с азов, если брать определение из всем известной и всеми любимой Википедии, то L-система (или же система Линденмайера) — это параллельная система переписывания и вид формальной грамматики. Если говорить простым языком, то L-система состоит из алфавита символов, которые могут быть использованы для создания строк, набора порождающих правил, которые задают правила подстановки вместо каждого символа, начальной строки ( “аксиомы” ), с которой начинается построение, и механизм перевода образованной строки в геометрические структуры. Самым простым примером L-системы может служить задача построения дерева. Вводные данные: Строка (далее Аксиома): A B Переменные (которые мы можем задействовать в построении дерева): A B C Правило (правило по которому каждая переменная на последующие строке меняется):
  • A - > AB
  • B - > AC
  • C - > A
Получаются такие преобразования:                                        ПоколениеСостояние1A B2AB AC3AB AC AB A4AB AC AB A AB AC AB5AB AC AB A AB AC AB AB AC AB A AB AC6и так далее…Основным направлением, в котором применяются L-системы, это моделирование процессов роста как живых организмов, так и неживых объектов (кристаллов, раковин моллюсков или пчелиных сот).Пример:
Для моделирования подобных процессов, мы с вами будем использовать такой язык программирования как Python, в нём есть встроенная библиотека “turtle”.
Итак, приступим:
  • Здесь мы импортируем библиотеку Turtle в наш проект: import turtle
  • Далее мы подключаем все необходимые конфигурации для нашей черепашки: turtle.hideturtle() turtle.tracer(1) turtle.penup() turtle.setposition(-300,340)turtle.pendown()turtle.pensize(1)
  • Далее мы задаём значение непосредственно самой аксиомы и сопутствующих параметров, необходимых для задания последовательности: axiom = "F+F+F+F"tempAx = "" itr = 3 (itr- значения итераций цикла, оно нам понадобится в следующем шаге при написании нашей программы)
  • В данном цикле, где как раз нам и понадобится переменная itr-, мы занимаемся обработкой и "выращиванием" непосредственно генома нашего фрактала/растения: for k in range(itr): for ch in axiom: if ch == "+": tempAx = tempAx + "+" elif ch == "-": tempAx = tempAx + "-" elif ch == "F": #F tempAx = tempAx + "F+F-f-F+F" else: tempAx = tempAx + "f" axiom = tempAx tempAx = " " print(axiom) Если мы с вами пробежимся по циклу, то сразу же в первом условии мы увидим фильтр на символ "+": if ch == "+": tempAx = tempAx + "+" Здесь мы ищем в аксиоме (изначальной строке) знак “+” и при его появлении мы добавляем символ “+” в последующую строчку. Так же происходит и с символом “-” и “f”, мы просто добавляем в последующую строчку символы “-” и “f” соответственно. Но при появлении в нашей аксиоме символа “F”, мы поступим немного иначе и добавим в последующую строчку уже последовательность символов “F + F – f – F + F”, для увеличения длины каждой последующей строки. Данное действие в принципе не принципиально, но для быстроты генерации “генома”, я решил поступить именно так. В конце мы обязательно приравниваем аксиому к нашему геному и обнуляем его:axiom = tempAx tempAx = " " Результат (значение аксиомы):
  • Ну что, вроде по генерации генома всё понятно, давайте уже приступим непосредственно к визуализации. Для этого нам понадобиться простенький цикл, который будет переводить встречающиеся в геноме символы в движения черепашки: for ch in axiom: if ch == "+": turtle.right(45) turtle.forward(10) turtle.right(45) elif ch == "-": turtle.left(45) turtle.forward(10) turtle.left(45) else: turtle.forward(20) Сразу можно заметить, что по аналогии с предыдущим пунктом, мы детектируем символы "+", "-", "F" и "f". Только теперь в момент, когда мы встречаем символ "+": if ch == "+": turtle.right(45) turtle.forward(10) turtle.right(45) Мы поворачиваем сначала на право, на 45 градусов, потом проезжаем расстояние, равное 10, и потом мы снова поворачиваем на право, на 45 градусов. Когда же мы встречаем символ "-": elif ch == "-": turtle.left(45) turtle.forward(10) turtle.left(45) Мы делаем все те же самые действия, что и при символе "+", только на этот раз поворачиваем уже не вправо, а уже влево. Но если же мы встретим символы "F" или "f", то мы просто буем проезжать вперёд на 20 пикселей: else: turtle.forward(20) В итоге мы получаем вот такой фрактал-снежинку:
  • Если же мы захотим раскрасить наш фрактал-снежинку, то нам понадобиться перед циклом из предыдущего пункта добавить строчки: turtle.fillcolor("#99BBFF")turtle.begin_fill() Где #99BBFF - это кодировка цвета (RGB: 153, 187, 255), а begin_fill() это начало заполнения цветом. И в конце, уже после цикла, добавить строчки: turtle.end_fill()turtle.update()turtle.done() А end_fill() означает конец заполнения. Далее мы обновляем и выключаем нашу "черепашку". И на выходе мы получаем вот такой фрактал-снежинку:
Вы так же можете посмотреть, "потыкать" код, изменяя параметры и данные в нём. В конце, хочу также добавить, что мне очень понравилось работать и писать по данной тематике, возможно, в будущем, я напишу ещё ряд статей по теме "L-системы", но а пока, хочу представить вам результаты моего тыканья творчества:
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_zanimatelnye_zadachki (Занимательные задачки), #_python, #_programmirovanie (Программирование), #_matematika (Математика), #_python, #_python3, #_lsystem, #_zadachi (задачи), #_zadachki (задачки), #_fraktaly (фракталы), #_fraktalnye_landshafty (фрактальные ландшафты), #_rastenija (растения), #_rastenija. (растения.), #_fan (фан), #_zanimatelnye_zadachki (
Занимательные задачки
)
, #_python, #_programmirovanie (
Программирование
)
, #_matematika (
Математика
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 11:10
Часовой пояс: UTC + 5