如何解决谢尔宾斯基的三角Pygame递归函数
我一直在研究指导文件,我们打算创建一个Sierpinksi三角形。应该看起来像这样: enter image description here
我不知道我的代码出了什么问题,导致它与我想要的输出不一样。有人可以帮我解决这个问题吗?
我无法执行我的功能。
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,[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,size):
mini_size = 10
if size < mini_size:
return draw_triangle(screen,size)
else:
new_size = int(size * 0.5)
sierpinski(screen,x + new_size,new_size)
sierpinski(screen,y - new_size,x - new_size,y + new_size,new_size)
解决方法
我在梅西大学(Massey Uni)上的课程也必须这样做。我使用的功能是:
def sierpinski(screen,x,y,size,MinSize):
if size <= MinSize:
#creating a new triangle object
T = triangle(x,white)
#drawing the triangle to screen
T.draw(screen)
#adding the triangle to the array
Triangle.append(T)
else:
#halving the size and then recalling this function
size = int(size / 2)
sierpinski(screen,MinSize)
sierpinski(screen,x + size,y - size,MinSize)
我为每个三角形而不是数组使用一个类,并使用一个变量存储sierpinski三角形的所有对象,以便在需要时可以重绘它。 确保只调用一次sierpinski函数(在主循环之前调用它)。 我的最终脚本是:
import sys,pygame,pyautogui
# Triangle class,Takes x,and color#
class triangle():
def __init__(self,color):
self.x = x
self.y = y
self.size = size
self.color = color
# Draws the triangle to the display,then updates the screen. Takes screen.
def draw(self,screen):
pygame.draw.polygon(screen,self.color,[[self.x,self.y],[self.x + self.size,[self.x,self.y - self.size]])
pygame.display.flip()
# Allows for the object to be printed. Used for testing
def __str__(self):
return "X: {},Y: {},Size: {}".format(self.x,self.y,self.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
#############################################################################################
#Sierpinski function,requires a surface(screen),y (anchor point),size (outer triangle),and minimum size.
def sierpinski(screen,MinSize)
#############################################################################################
# Initialize the game engine
pygame.init()
# Define the colors we will use in RGB format
black = [0,0]
white = [255,255,255]
blue = [0,255]
green = [0,0]
red = [255,0]
# Array for the triangles
Triangle = []
# sets the height and width of the screen using pyautogui
Screen_Width,Screen_Height = pyautogui.size()
screen = pygame.display.set_mode((Screen_Width,Screen_Height),pygame.FULLSCREEN)
clock = pygame.time.Clock()
# Draw Sierpinski's triangle at a given size anchored at a given location
# Only needs to be called once#
sierpinski(screen,800,2)
while True:
# 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
break # Flag that we are done so we exit this loop
#Getting key input
Key = pygame.key.get_pressed()
#if the user presses the escape key,the loop breaks,and program closes
if Key[pygame.K_ESCAPE]:
break
# Tidy up
pygame.quit()
,
需要一些更改:
def sierpinski(screen,size):
mini_size = 10
if size < mini_size:
return draw_triangle(screen,size) # give white colour
else:
new_size = int(size * 0.5)
#draw_triangle(screen,size) # give black colour colour
sierpinski(screen,x + new_size,new_size) # here location x,y
sierpinski(screen,y - new_size,new_size)
sierpinski(screen,x - new_size,y + new_size,new_size)# here x+new_size,y
它看起来像:
def sierpinski(screen,size):
mini_size = 10
if size < mini_size:
return draw_triangle(screen,size)
else:
new_size = int(size*0.5)
draw_triangle1(screen,new_size)
sierpinski(screen,y-new_size,x+new_size,new_size )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。