Треугольник Серпинского Pygame рекурсивный
Итак, для моей текущей университетской работы мы должны создать треугольник Серпински и рекурсивно нарисовать новые треугольники внутри.
исходный код, который мы получили, был следующим:
import sys, pygame
# a function that will draw a right-angled triangle of a given size anchored at a given location
def draw_triangle(screen, x, y, size):
pygame.draw.polygon(screen,white,[[x,y], [x+size,y], [x,y-size]])
#############################################################################################
# Define a function that will draw Sierpinski's Triangle at a given size anchored at a given location
# You need to update this function
# currently only one triangle is drawn
def sierpinski(screen, x, y, size):
draw_triangle(screen, x, y, size)
#############################################################################################
# Initialize the game engine
pygame.init()
# Define the colors we will use in RGB format
black = [ 0, 0, 0]
white = [255,255,255]
blue = [ 0, 0,255]
green = [ 0,255, 0]
red = [255, 0, 0]
# Set the height and width of the screen
size=[512, 512]
screen=pygame.display.set_mode(size)
# Loop until the user clicks the close button.
done=False
clock = pygame.time.Clock()
while done==False:
# This limits the while loop to a max of 10 times per second.
# Leave this out and we will use all CPU we can.
clock.tick(10)
for event in pygame.event.get(): # User did something
if event.type == pygame.QUIT: # If user clicked close
done=True # Flag that we are done so we exit this loop
# Clear the screen and set the screen background
screen.fill(black)
# Draw Sierpinski's triangle at a given size anchored at a given location
sierpinski(screen,0, 512, 512)
# Go ahead and update the screen with what we've drawn.
# This MUST happen after all the other drawing commands.
pygame.display.flip()
# Tidy up
pygame.quit ()
Ок, я знаю, что это создает только один треугольник. Вот что я сделал, чтобы заставить его работать "вроде":
Я создал новую функцию треугольника, чтобы нарисовать перевернутый треугольник:
def draw_upside_down_triangle(screen, x, y, size, color):
pygame.draw.polygon(screen, color, [[x+size, y+size], [x+size, y], [x, y]])
затем я обновил старую функцию треугольника, чтобы принять цвет переменная:
def draw_triangle(screen, x, y, size, color):
pygame.draw.polygon(screen, color, [[x, y], [x+size, y], [x, y-size]])
после этого я обновил основную функцию, которая будет рекурсивно рисовать треугольники:
def sierpinski(screen, x, y, size):
if size < 10:
return False
else:
draw_triangle(screen, x, y, size, white)
draw_upside_down_triangle(screen, x, y/2, size/2, black)
sierpinski(screen, x+size/2, y+size/2, size/2)
sierpinski(screen, x, y-size/2, size/2)
sierpinski(screen, x, y, size/2)
sierpinski(screen, x, y+size/2, size/2)
Я запустил функцию off
- добавив аргумент exit (когда треугольник get слишком мал, возвращает false)
- если он не слишком мал, нарисуйте первый треугольник белым цветом
- после этого нарисуйте перевернутый треугольник вдвое меньше размера в том же месте x, но наполовину Y в черный (это создает иллюзию треугольника 3)
- после всего этого у меня есть 4 рекурсивных вызова, основанных на экспериментах, я знаю, что порядок этих вызовов имеет значение, поскольку выход радикально меняется при изменении.
в настоящий момент текущий объем производства следующим образом:
Я не прошу кого-либо закончить или исправить мой код просто лучшее понимание или точку в правильном направлении. Сражались с это на несколько часов.
спасибо!
1 ответов
взгляните на следующую ссылку, которая реализует треугольник Серпинского это...
http://interactivepython.org/runestone/static/pythonds/Recursion/graphical.html#sierpinski-triangle
много хороших обсуждений вокруг проблемы и 40 некоторых строк кода для ее реализации.
также из-за того, как работает модуль черепахи, вы можете смотреть, как каждый треугольник рисует один за другим. Это очень полезно при просмотре кода, потому что вы можете визуализировать уровни рекурсии и когда они происходят. Я не знаю, насколько сложно это было бы реализовать в pygame, но если вы можете замедлить создание треугольника, это значительно облегчает понимание логики.
вы говорите, что вам нужны 4 рекурсивных вызова на основе эксперимента, но можете ли вы объяснить логику за ним? Интуитивно это кажется неправильным, поскольку вам нужно только три новых треугольника плюс один частично покрытый родитель, чтобы равняться четырем меньшим равносторонним треугольникам. (См. это делается по ссылке?)
можете ли вы объяснить, почему вы используете метод перевернутого треугольника? Это похоже на работу с жуками? Вы должны иметь возможность рисовать перевернутые треугольники, используя отрицательное пространство из вашей нормальной функции треугольника. В ссылке вы увидите, что автор рисует зеленый треугольник, обращенный в том же направлении, что и все остальное, но позже покрывает его большим количеством треугольников, пока зеленый не повернется в противоположном направлении.
все в общем, похоже, вы близки. Вам просто нужно получить этот последний кусок логики рекурсии правильно.
П. С.
одна незначительная незначительная критика стиля-только потому, что это написано на python и считывается. Вы можете использовать While True
а то break
чтобы избежать дополнительной переменной done
.