Автор оригинала: Robin Andrews.
Одна из замечательных вещей в Python Turtle Graphics заключается в том, как она дает вам мгновенную визуальную обратную связь о том, что делает ваша программа. Это делает его очень мощным инструментом для изучения многих тем-информатики и программирования в целом. Эта статья посвящена использованию графики черепахи Python для рисования фрактального паттерна, используя важный метод программирования, называемый рекурсия . Вы можете прочитать больше о рекурсии в целом в этом посте в блоге . Здесь мы подробнее остановимся на том, как черепашья графика используется для рисования узора.
Вы можете увидеть программу в действии здесь на repl.it
Фрактал – это повторяющийся паттерн, который выглядит одинаково на разных уровнях увеличения.
Если вы новичок в программировании на Python, основной код этой программы, вероятно, будет слишком сложным для понимания. Тем не менее, даже будучи новичком, вы можете получить довольно большой пробег, играя со значениями этих констант:
СКОРОСТЬ
BG_COLOR
ЦВЕТ ПЕРА
ШИРИНА ПЕРА
FRACTAL_DEPTH
Измените их значения и посмотрите, какой эффект они окажут. Для цветов возможны наиболее распространенные названия цветов – просто не забудьте поместить имя внутри ""
s, например "darkorchid"
. Полный список возможных цветов доступен здесь .
Классическим примером фракталов в природе являются листья папоротника – обратите внимание, как исходная форма повторяется в меньшем масштабе внутри листа.
Фрактал H-дерева с графикой черепах Питона
Фрактал H-дерева – довольно простой фрактал с простым правилом для его построения.
H-фрактал-это фрактал, построенный, начиная с отрезков линии, соответствующих заглавной букве H, а затем многократно помещая меньшие H по центру вверху и внизу каждого свободного вертикального сегмента.
Он может быть описан другими способами, и существуют различия в точных измерениях, но для того, как мы его реализуем, это описание является наиболее полезным.
Это лучше всего понять с помощью фотографий:
Вот уровень 0 (люди Python любят считать с нуля….)
Следующий уровень или глубина добавить H фигуры в каждом из углов предыдущей версии:
….. и картина повторяется..
Следующий уровень:
Код Python для фрактального H-дерева с черепашьей графикой
Самая важная работа, проделанная этой программой, заключается в призывах к
recursive_draw(tur, x, y, ширина, высота, количество)
Аргументы относятся к черепахе, которую мы хотим нарисовать, координатам x , y
, где will начнет рисовать наш H , и ширине/высоте для H , требуемой на этом конкретном уровне. Обратите внимание, что по мере того, как функция вызывает себя, чтобы нарисовать новый H шпаес, эти аргументы меняются!
Чтобы понять, как на самом деле работает эта программа, вам нужно будет временно отвести взгляд от экрана. Возьмите обычную бумагу или графическую бумагу и карандаш, нарисуйте оси x и y и начните отмечать некоторые значения координат. Вы можете проверить свою работу, раскомментировав инструкцию print
внутри draw_line ()
, чтобы получить представление о том, что происходит внутри программы. Например:
recursive_draw
изначально вызывается с помощью recursive_draw(исполнитель, - DRAWING_WIDTH/2, - DRAWING_HEIGHT/2, DRAWING_WIDTH, DRAWING_HEIGHT, FRACTAL_DEPTH)
Этот начальный вызов draw_line()
, который вызывается из recursive_draw()
, будет использовать эти координаты:
Следует отметить две очень важные вещи, без которых рекурсия не может работать::
- Базовый случай
- Рекурсивный шаг
Они помечены комментариями в коде. Все рекурсивные алгоритмы должны приближаться к базовому случаю, иначе они никогда не перестанут выполняться, пока не закончится доступная память.
Список кода Python для фрактала H-дерева
Вот полный список для фрактала H-дерева графики черепахи Python:
""" H-Tree Fractal using recursion and Turtle Graphics. Robin Andrews - https://compucademy.net/ """ import turtle SPEED = 5 BG_COLOR = "blue" PEN_COLOR = "lightgreen" SCREEN_WIDTH = 800 SCREEN_HEIGHT = 800 DRAWING_WIDTH = 700 DRAWING_HEIGHT = 700 PEN_WIDTH = 5 TITLE = "H-Tree Fractal with Python Turtle Graphics" FRACTAL_DEPTH = 3 def draw_line(tur, pos1, pos2): # print("Drawing from", pos1, "to", pos2) # Uncomment for tracing the algorithm. tur.penup() tur.goto(pos1[0], pos1[1]) tur.pendown() tur.goto(pos2[0], pos2[1]) def recursive_draw(tur, x, y, width, height, count): draw_line( tur, [x + width * 0.25, height // 2 + y], [x + width * 0.75, height // 2 + y], ) draw_line( tur, [x + width * 0.25, (height * 0.5) // 2 + y], [x + width * 0.25, (height * 1.5) // 2 + y], ) draw_line( tur, [x + width * 0.75, (height * 0.5) // 2 + y], [x + width * 0.75, (height * 1.5) // 2 + y], ) if count <= 0: # The base case return else: # The recursive step count -= 1 # Top left recursive_draw(tur, x, y, width // 2, height // 2, count) # Top right recursive_draw(tur, x + width // 2, y, width // 2, height // 2, count) # Bottom left recursive_draw(tur, x, y + width // 2, width // 2, height // 2, count) # Bottom right recursive_draw(tur, x + width // 2, y + width // 2, width // 2, height // 2, count) if __name__ == "__main__": # Screen setup screen = turtle.Screen() screen.setup(SCREEN_WIDTH, SCREEN_HEIGHT) screen.title(TITLE) screen.bgcolor(BG_COLOR) # Turtle artist (pen) setup artist = turtle.Turtle() artist.hideturtle() artist.pensize(PEN_WIDTH) artist.color(PEN_COLOR) artist.speed(SPEED) # Initial call to recursive draw function recursive_draw(artist, - DRAWING_WIDTH / 2, - DRAWING_HEIGHT / 2, DRAWING_WIDTH, DRAWING_HEIGHT, FRACTAL_DEPTH) # Every Python Turtle program needs this (or an equivalent) to work correctly. turtle.done()
Счастливых вычислений!
Эта статья основана на посте на Блог академии Компу .