使用turtle模块绘制西奥多罗斯螺旋时遇到困难

0 投票
1 回答
2125 浏览
提问于 2025-04-28 11:46

我在做编程作业时遇到一个问题,需要用turtle模块来画泰奥多罗斯螺旋,而且n要设为17。

我已经把代码写好了,但每次画出来的图形比例都很奇怪。比如说,第一个三角形的边长是sqrt(1)、1和sqrt(2),这个三角形应该是一个45度的等腰三角形,但在turtle里,1像素就等于1,所以这个三角形会小得看不清楚。我得用更大的数字,比如100,但如果我用100,第一个三角形的边长就变成了sqrt(100)、100和sqrt(200),这样就不再是同样比例的三角形了。

这是我的代码:

def TheodorusSpiral(myTurtle,n,d):
    import math
    myTurtle=turtle
    myTurtle.pu()
    myTurtle.home()
    myTurtle.pd()
    myTurtle.fd(d)
    myTurtle.lt(90)
    myTurtle.fd(d)
    myTurtle.lt(45)
    for i in range(n-1):
        a = (i+2)*d
        c = math.fabs(d*math.sqrt(a))
        angle = math.degrees(math.atan(c/d))
        angle2 = math.degrees(math.atan(d/d*math.sqrt(a+1)))
        angle3 = math.degrees(math.atan(d*math.sqrt(a+1)/d))
        angle4 = 180 - (angle2 + angle3)
        angle5 = 180 -(angle + angle4)
        myTurtle.fd(d)
        myTurtle.lt(angle5)



TheodorusSpiral(1,4,50)

还有一个问题是,当我调用这个函数时,参数“myTurtle”不能用像“tim”这样的名字/字母来调用。

比如说,调用TheodorusSpiral(tim,4,50)时会出现错误:

“tim没有定义”

暂无标签

1 个回答

0

我建议你在计算角度的时候,假装你在画一个图,腿的长度设为1,就像维基百科上的图那样。所以在你的角度计算中根本不需要用到d,可以这样做:

import turtle
def TheodorusSpiral(myTurtle,n,d):
    import math
    myTurtle=turtle
    myTurtle.pu()
    myTurtle.home()
    myTurtle.pd()
    myTurtle.fd(d)
    myTurtle.lt(90)
    myTurtle.fd(d)
    myTurtle.lt(45)
    for i in range(n-1):
        a = (i+2)
        c = math.fabs(math.sqrt(a))
        angle = math.degrees(math.atan(c/1))
        angle2 = math.degrees(math.atan(1/math.sqrt(a+1)))
        angle3 = math.degrees(math.atan(math.sqrt(a+1)/1))
        angle4 = 180 - (angle2 + angle3)
        angle5 = 180 -(angle + angle4)
        myTurtle.fd(d)
        myTurtle.lt(angle5)

TheodorusSpiral(1,4,50)

除了对角度计算的修改(我基本上把d从数学公式中完全去掉了,这样就能正常工作),我还在示例代码中加上了“import turtle”这一行,这样你就可以直接复制粘贴,代码就能正确运行。

至于你提到的另一个问题,就是你尝试调用TheodorusSpiral(tim,4,50)时失败了——这里面有个关于Python变量的基本误解。你提到这是一个作业——我强烈建议你去问你的老师这个问题,因为你需要比我有时间解释的更详细的说明。(抱歉)。把你想做的事情告诉老师,请他/她解释一下为什么会失败。

撰写回答