使用递归绘制雪花

时间:2015-08-31 02:55:53

标签: python recursion turtle-graphics fractals

我想创建一个这样的输出:

enter image description here

我必须使用递归。

到目前为止,这就是我的代码:

from turtle import *


    def drawFlake(length,depth):

        fd(length)
        input("first line done")
        if depth>0:


            left(60)
            drawFlake(length/3,depth-1)

            input("1")
            left(120)
            drawFlake(length/3,depth-1)
            input("2")

            left(120)
            drawFlake(length/3,depth-1)
            input("3")

            left(120)
            drawFlake(length/3,depth-1)
            input("4")

            left(120)
            left(180)
            #drawFlake(length/3,depth-1)
            input("1")

            left(120)
            drawFlake(length/3,depth-1)

            input("THIS IS THE LAST")
            left(60)



        left(180)
        fd(length)


drawFlake(100,3)

这会产生这样的输出(这里,N = 3)

问题是左边是长行。应该没有长线。相反,应该有另一种薄片模式

我做错了什么?

enter image description here

编辑::

这是我设法提出的更好的东西。但它仍然不完美:

def doFigure(length,depth):

        left(120)
        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)

        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth>1:
         doFigure(length/3,depth-1)
        bk(length)
        right(60)

        fd(length)
        if depth == 3:

            doFigure(length/3,depth-1)
        bk(length)
        right(180)

enter image description here

注意最后一行。我不得不对值3进行硬编码以获得正确的值。

4 个答案:

答案 0 :(得分:1)

这是一个解决方案:它并不完美,因为与你发布的图纸相比,它在主干上有一堆额外的。

请告诉我这是否适合您。

来自海龟进口*

def drawFlake(length, depth):
    "draws a flake"
    if depth > 0:
        for _ in range(6):
            forward(length)
            drawFlake(length // 3, depth - 1)
            backward(length)
            left(60)

drawFlake(200,4)

Flake depth 4

答案 1 :(得分:1)

几天后,我想出了一个解决方案。这绝对不是最好的解决方法(如果有更多的人发布他们的解决方案,我会很高兴),但它确实显示输出完全像我的原始图片。

def makeFlake(length,depth,isRoot=True):
    """
    This function draws the flakes. To draw the smaller flakes, this function is called recursively
    :param length: the length of the biggest flake's branch
    :param depth: The number of smaller flakes to draw
    :param isRoot: Draw an extra branch if the value is true. Note that true is the default value. 
    """
    if depth>0:
        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        if isRoot == True:
         makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

        forward(length)
        makeFlake(length // 3, depth - 1,False)
        backward(length)
        left(60)

答案 2 :(得分:1)

如果要精确地绘制它,则必须跳过6条辐条中每第4个最里面的雪花(即从0到5循环跳过每一个“ 3”)

这是一个代码

import turtle as t

#assigning random value for outer at the start, this will be changed later
OUTER=-1
LEN=300
def drawSnowflake(N,LEN):
    if N<0:
        return
    for i in range(6):
        t.forward(LEN)
        #skipping every 4th spoke but not for the level N
        if i==3 and N!=OUTER:
            pass
        else:
            drawSnowflake(N-1,LEN/4)
        t.backward(LEN)
        t.left(60)



def main():
    N=int(input("Enter a max value of N"))
    global OUTER
    OUTER=N
    t.speed(0)
    drawSnowflake(N,LEN)
    t.exitonclick()


if __name__=="__main__":
    main()

答案 3 :(得分:1)

我喜欢@amipro(+1)的解决方案,除了它会覆盖现有的行(效率低下,请仔细查看。)而且我也更喜欢您在自己的解决方案(+1)中标记根系的方法。因此,这是我自己的解决方案,希望能同时体现两者的优点:

from turtle import *

def makeFlake(length, depth, isRoot=True):

    if depth > 0:
        for branch in range(6):
            if isRoot or branch != 3:
                forward(length)
                makeFlake(length / 3, depth - 1, False)
                backward(length)

            left(60)

tracer(False)  # because I have no patience
makeFlake(100, 4)
tracer(True)

hideturtle()

exitonclick()

enter image description here