2015-08-02 96 views
9

Vì vậy, đối với bài báo đại học hiện tại của chúng tôi, chúng tôi muốn tạo ra Tam giác Sierpinksi và Thu thập đệ quy các hình tam giác mới bên trong.Hình tam giác Pygame của Tam giác Sierpinski

Mã ban đầu chúng tôi đã nhận được này:

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() 

Ok Tôi biết rằng điều này chỉ tạo ra một tam giác duy nhất. Đây là những gì tôi đã làm để làm cho nó làm việc "loại":

Tôi tạo ra một hàm tam giác mới để vẽ một lộn ngược tam giác:

def draw_upside_down_triangle(screen, x, y, size, color): 
     pygame.draw.polygon(screen, color, [[x+size, y+size], [x+size, y], [x, y]]) 

Sau đó, tôi được cập nhật chức năng tam giác cũ để chấp nhận một biến màu :

def draw_triangle(screen, x, y, size, color): 
     pygame.draw.polygon(screen, color, [[x, y], [x+size, y], [x, y-size]]) 

Sau đó tôi cập nhật các chức năng chính mà đệ quy sẽ vẽ hình tam giác:

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) 

tôi bắt đầu chức năng tắt

  1. Bằng cách thêm tham số exit (khi hình tam giác được của lợi nhuận quá nhỏ false)
  2. Nếu nó không phải là quá nhỏ sau đó vẽ hình tam giác đầu tiên trong trắng
  3. Sau đó vẽ một hình tam giác lộn ngược một nửa kích thước tại cùng một vị trí x nhưng một nửa vị trí y trong màu đen (điều này tạo ra ảo giác tam giác)
  4. Sau khi tất cả tôi có 4 cuộc gọi đệ quy, dựa trên thử nghiệm, tôi biết rằng thứ tự của các cuộc gọi này quan trọng khi đầu ra thay đổi hoàn toàn khi thay đổi.

Hiện nay sản lượng hiện nay như sau:

Sierpinski's Triangle Pygame Recursive

Tôi không yêu cầu cho bất cứ ai để kết thúc hoặc sửa mã của tôi chỉ đơn giản là một sự hiểu biết tốt hơn hoặc một điểm đi đúng hướng. Đã chiến đấu với cái này trong vài giờ.

Cảm ơn!

+0

Nhắc tôi về một trong những kịch bản pygame ban đầu của tôi, nơi tôi vẽ Tam giác Sierpinski bằng cách sử dụng kỹ thuật [hỗn loạn trò chơi] (https://en.wikipedia.org/wiki/Chaos_game). – elParaguayo

Trả lời

3

Hãy xem tại liên kết sau mà thực hiện tam giác Sierpinski của ...

http://interactivepython.org/runestone/static/pythonds/Recursion/graphical.html#sierpinski-triangle

Rất nhiều cuộc thảo luận tốt xung quanh vấn đề và 40 số dòng mã để thực hiện nó.

Cũng vì cách thức hoạt động của mô-đun rùa, bạn có thể xem từng hình tam giác được vẽ từng cái một. Điều này cực kỳ hữu ích khi bạn xem lại mã vì bạn có thể hình dung mức độ đệ quy và khi chúng xảy ra. Tôi không biết làm thế nào khó khăn này sẽ được thực hiện trong pygame nhưng nếu bạn có thể làm chậm việc tạo tam giác nó làm cho sự hiểu biết logic dễ dàng hơn nhiều.

Bạn nói rằng bạn cần 4 cuộc gọi đệ quy dựa trên thử nghiệm nhưng bạn có thể giải thích logic đằng sau nó không? Trực giác điều này có vẻ sai vì bạn chỉ cần ba tam giác mới cộng với một phần cha mẹ được bảo hiểm để bằng bốn tam giác đều nhỏ hơn. (Xem cách thực hiện điều này trong liên kết?)

Bạn có thể giải thích lý do bạn đang sử dụng phương pháp hình tam giác lộn ngược không? Điều này có vẻ giống như một công việc dễ bị lỗi? Bạn sẽ có thể vẽ các hình tam giác lộn ngược bằng cách sử dụng không gian âm từ hàm tam giác bình thường của bạn. Trong liên kết bạn sẽ thấy rằng tác giả vẽ một hình tam giác màu xanh lá cây hướng về cùng một hướng như mọi thứ khác nhưng sau đó che nó lại với nhiều hình tam giác hơn cho đến khi hình tròn màu xanh lá cây quay về hướng ngược lại.

Tất cả trong tất cả có vẻ như bạn đã thân thiết. Bạn chỉ cần nhận được mảnh cuối cùng của logic đệ quy ngay.

P.S.

Một phê bình nhỏ về phong cách nhỏ - chỉ vì điều này được viết bằng số lượng trăn và khả năng đọc. Bạn có thể sử dụng While True và sau đó break để tránh biến phụ done.

+0

cảm ơn sự giúp đỡ! Đó là một bước đi đúng hướng nhưng nó vẫn chưa hoàn thành. Tôi đã hoàn nguyên toàn bộ tập lệnh về lại tập lệnh gốc được cung cấp, sau đó tôi đã thêm tham số màu vào hàm tam giác. Tôi đã sửa đổi chức năng chính bằng cách sử dụng cùng một ngắt như trước và thêm một số logic mới để vẽ một tam giác cơ sở và sau đó 3 tam giác phụ sau đó tôi đệ quy gọi hàm 3 lần để vẽ hình tam giác trong 3 hình tam giác phụ đó. Tôi dán mã ở đây trong [pastebin] (http://pastebin.com/f6qyahwj) –

+0

Vấn đề là hình tam giác đầu tiên ở góc trên bên trái không được in ngay bây giờ. PS chức năng looping chính là như được cung cấp bởi các giáo sư vì vậy tôi sẽ không đi thay đổi bất cứ điều gì họ không đánh dấu trên, nhưng cảm ơn cho người đứng đầu lên :) –

+0

Cuối cùng quản lý để làm điều đó nhờ sự giúp đỡ tất cả! –