因此,对于我目前的大学论文,我们的目的是创建一个Sierpinksi三角形,并在内部递归绘制新的三角形。
我们得到的原始代码是:
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)
我启动了该功能
答案 0 :(得分:3)
看一下实现Sierpinski三角形的以下链接......
http://interactivepython.org/runestone/static/pythonds/Recursion/graphical.html#sierpinski-triangle
围绕这个问题进行了很多讨论,并且有40行代码来实现它。
另外,由于龟模块的工作方式,您可以逐个观看每个三角形。在查看代码时,这非常有用,因为您可以可视化递归级别以及何时发生。我不知道在pygame中实现有多难,但是如果你可以减慢三角形的创建速度,那么就可以更容易理解逻辑。
你说你需要基于实验的4个递归调用,但你能解释它背后的逻辑吗?直觉上这似乎是错误的,因为你只需要三个新的三角形加一个部分覆盖的父级来等于四个较小的等边三角形。 (请参阅链接中的操作方法?)
您能解释一下为什么使用倒三角形方法吗?这看起来有点像容易出错的工作?您应该能够使用正常三角函数中的负空间绘制倒三角形。在链接中,您会看到作者绘制的绿色三角形朝向与其他所有方向相同的方向,但后来用更多三角形覆盖它,直到绿色三角形朝向相反方向。
总而言之,您似乎已经关闭了。你只需要获得最后一段递归逻辑。
P.S。
一个小的轻微风格批评 - 只是因为这是用python编写的,可读性很重要。您可以使用While True
然后使用break
来避免额外变量done
。