Python中如何用ThinkPython练习4-5画阿基米德螺旋线?

题目:在 wiki 上阅读有关 Spiral 的信息,编写程序画出阿基米德螺线

最开始只想到了用 matplotlib 的做法...然后去看了书上提供的 代码

到底是个数学问题,书上提供的这个函数看的我万脸懵逼...希望有大佬解释一下

原图


Python中如何用ThinkPython练习4-5画阿基米德螺旋线?

1 回复

import turtle
import math

def draw_spiral(t, n, length=3, a=0.1, b=0.2):
    """绘制阿基米德螺旋线
    t: turtle对象
    n: 迭代次数
    length: 基础步长
    a: 螺旋线参数a
    b: 螺旋线参数b
    """
    theta = 0.0
    for i in range(n):
        # 阿基米德螺旋线极坐标方程: r = a + b*theta
        r = a + b * theta
        # 将极坐标转换为直角坐标
        x = r * math.cos(theta)
        y = r * math.sin(theta)
        
        # 移动到计算出的坐标位置
        t.goto(x, y)
        
        # 增加角度
        theta += 0.1

def main():
    # 设置窗口
    wn = turtle.Screen()
    wn.title("阿基米德螺旋线")
    wn.bgcolor("white")
    
    # 创建turtle对象
    t = turtle.Turtle()
    t.speed(0)  # 最快速度
    t.color("blue")
    t.pensize(2)
    
    # 提起笔,移动到起始位置
    t.penup()
    t.goto(0, 0)
    t.pendown()
    
    # 绘制螺旋线
    draw_spiral(t, n=500, length=3, a=0.1, b=0.2)
    
    # 隐藏turtle并保持窗口
    t.hideturtle()
    wn.mainloop()

if __name__ == "__main__":
    main()

这个实现的关键点:

  1. 使用极坐标方程 r = a + b*theta 描述阿基米德螺旋线
  2. 通过 math.cos()math.sin() 将极坐标转换为直角坐标
  3. 参数 a 控制起始半径,b 控制螺旋间距
  4. 通过循环逐渐增加角度 theta 来绘制连续曲线

你可以调整 ab 参数来获得不同形状的螺旋线,比如:

  • draw_spiral(t, n=500, a=0, b=0.1) 从中心开始的紧密螺旋
  • draw_spiral(t, n=300, a=10, b=0.05) 起始半径较大的平缓螺旋

一句话总结:用极坐标方程配合turtle的goto()方法就能画出精确的螺旋线。

回到顶部