【问题标题】:fractal curve / levy curve issues分形曲线/征税曲线问题
【发布时间】:2017-11-11 21:43:42
【问题描述】:

我遇到了分形曲线问题。我在 OS X El Capitan 上的 Python 2.7 和 3.6 上都试过了。我不能让乌龟动起来。这是直接取自书中的代码。 screenshot of turtle not moving 设置为0,根据书本应该画一条直线。但它不动。这本书给了我们代码:

from turtle import Turtle

def cCurve(t, x1, y1, x2, y2, level):
    def drawLine(x1, y1, x2, y2):
        t.up()
        t.goto(x1, y1)
        t.down()
        t.goto(x2, y2)

        if level == 0:
            drawLine(x1, y1, x2, y2)
        else:
            xm = (x1 + x2 + y1 - y2) //2
            ym = (x2 + y1 + y2 - x1) //2
            cCurve(t, x1 ,y1 ,xm, ym, level -1)
            cCurve(t, xm, ym, x2, y2, level -1)
def main():
    level = int(input("Enter the level(0 or greater):" ))
    t = Turtle()
    t.hideturtle()
    cCurve(t, 50, -50, 50, 50, level)


main()

【问题讨论】:

  • if level == 0 的缩进错误;
  • drawLine() 函数的定义嵌套在 cCurve() 函数中,它永远不会被调用,因此不会绘制任何内容。
  • 书上说这个程序包括3个函数定义cCurve、drawLine和main。因为 drawLine 是一个辅助函数,所以它的定义嵌套在 cCurve 中。这就是它嵌套的原因。
  • @trincot 谢谢。你帮我解决了为什么它不动的问题。

标签: python recursion turtle-graphics fractals


【解决方案1】:

在解决了@trincot 指出的缩进问题之后,我想证明人们和书籍在编写这样的程序时经常会忽略turtle 的Vec2D 类的价值。虽然Vec2D 并不完美,缺乏访问单个元素的好方法并且没有除法,所以你必须使用乘法,它可以通过处理点而不是单个 X 和 Y 值来清理代码:

from turtle import Screen, Turtle, Vec2D

X, Y = range(2)

def cCurve(turtle, p1, p2, level):

    def drawLine(turtle, p1, p2):
        turtle.penup()
        turtle.goto(p1)
        turtle.pendown()
        turtle.goto(p2)

    if level == 0:
        drawLine(turtle, p1, p2)
    else:
        s = (p1 + p2) * 0.5  # sum / 2
        d = (p1 - p2) * 0.5  # difference / 2

        m = Vec2D(s[X] + d[Y], s[Y] - d[X])

        cCurve(turtle, p1, m, level - 1)
        cCurve(turtle, m, p2, level - 1)

def main():
    level = int(input("Enter the level (0 or greater): "))

    screen = Screen()

    cCurve(Turtle(visible=False), Vec2D(50, -50), Vec2D(50, 50), level)

    screen.mainloop()

main()

您可以将Vec2D 导入到与海龟没有任何关系的程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多