3
import turtle
w=turtle.Screen()

def Tri(t, order, size):

    if order==0:
        t.forward(size)
        t.left(120)
        t.forward(size)
        t.left(120)
        t.forward(size)
        t.left(120)

    else:
        t.pencolor('red')
        Tri(t, order-1, size/2, color-1)
        t.fd(size/2)
        t.pencolor('blue')
        Tri(t, order-1, size/2, color-1)
        t.fd(size/2)
        t.lt(120)
        t.fd(size)
        t.lt(120)
        t.fd(size/2)
        t.lt(120)
        t.pencolor('green')
        Tri(t, order-1, size/2,color-1)
        t.rt(120)
        t.fd(size/2)
        t.lt(120)

任何人都可以帮助解决这个问题吗?
我想要一个在特定深度有颜色的谢尔宾斯基三角形,如下所示:

我不知道如何使三角形颜色在特定深度发生变化。
提前致谢!

4

2 回答 2

2

我想你已经几乎解决了这个问题。我看到您的递归调用已经在尝试将color值传递给递归的每个较低级别。要让它工作,您需要做的就是将它作为一个额外的参数添加到您的函数中,并使您的颜色更改命令以它为零为条件(表明您已经下降到指定的级别)。

在类似 python 的伪代码中:

def Tri(t, order, size, color):
    if order == 0:
         # draw a triangle (maybe doing coloring of the sides if color == 0 too?)

    else:
         if color == 0:
             # set first color

         Tri(t, order-1, size/2, color-1)

         if color == 0:
             # set second color

         # move to next position

         Tri(t, order-1, size/2, color-1)

         if color == 0:
             # set third color

         # move to next position

         Tri(t, order-1, size/2, color-1)

         # move to end position

可能还有其他一些小问题需要解决,例如确保您的移动命令在正确绘制三角形后不会最终重新着色三角形的某些边缘。很久没有做海龟图形了,所以我不得不把细节留给你。

于 2012-12-02T05:40:08.260 回答
0

这是我能想到的最简洁的方法

angles = [0, 120, 240]
colors = ["red", "blue", "magenta"]

def draw_equi_triang(t, size):
    for i in range(3):
        t.forward(size)
        t.left(120)

def shift_turtle(t, size, angle):

    # moves turtle to correct location to begin next triangle

    t.left(angle)
    t.penup()
    t.forward(size)
    t.pendown()
    t.right(angle)

def sierpinski(t, order, size, colorChangeDepth = -1):

    # draw an equilateral triangle at order 0

    if order == 0:
        draw_equi_triang(t, size)

    # otherwise, test if colorChangeDepth == 0 and when it does change the color

    else:
        if colorChangeDepth == 0:
            # get index of angles
            for (ind, angle) in enumerate (angles):
                t.color(colors[ind])
                sierpinski(t, order-1, size/2, colorChangeDepth-1)
                shift_turtle(t, size/2, angle)
        # if colorChangeDepth does not == 0 yet
        else:
            for angle in angles:
                sierpinksi(t, order-1, size/2, colorChangeDepth-1)
                shift_turtle(t, size/2, angle) 
于 2018-02-20T18:14:30.000 回答