了解“ Think Python”中的乌龟圆和圆弧

时间:2018-08-24 05:35:54

标签: python geometry turtle-graphics

在“ Think Python”的界面设计部分中,我需要帮助来理解圆形和圆弧函数的方法,如下所示:

import turtle
import polygon
bob = turtle.Turtle()

print(bob)

def polygon(t, n, length):

    angle = 360 / n
    for i in range(n):
        t.fd(length)
        t.lt(angle)

然后,本书介绍了使用多边形函数绘制圆的另一种方法:

def circle(t, r):

    circumference = 2 * math.pi * r
    n = int(circumference / 3 ) + 1
    length = circumference / n
    polygon(t, n, length)

我不明白的地方:

  • 我不知道他们为什么定义circumference来画圆以及它如何画圆。

  • 如果我调用circle(bob, 100)之类的函数,那么它只会画圆的一部分,而不是整个圆。

  • 我不明白为什么需要n,以及该过程如何绕圈。

1 个答案:

答案 0 :(得分:1)

  

我不知道为什么他们要定义圆周来画圆,以及它如何   画一个圆

一种可视化圆形的方法是绘制一个多边形,该多边形的边数等于圆的(整数)周长,每边的长度为1。对于半径= 100的圆,将是:

polygon(bob, 628, 1)  # 628 = 2 * PI * 100

这会画出一个不错但很慢的圆圈:

enter image description here

我们可以通过使用更粗略的近似来加快速度。上面的circle()函数将多边形的边数任意除以3,然后将边长增加3:

polygon(bob, 209, 3)

这只是一个粗糙的圆圈,但绘制速度更快:

enter image description here

  

如果我调用诸如circle(bob,100)之类的函数,那么它只会绘制一个   圆的一部分而不是整个圆。

我相信您正在将上面定义的circle()函数与turtle附带的circle()方法混合使用。通过这种方式重用“圆圈”这个名称使作者感到困惑。乌龟circle()方法的第二个参数是 extent

  

范围-角度-确定       画圆。如果未给出范围,则绘制整个圆。       如果范围不是一个完整的圆,则圆弧的一个端点为       当前笔位置。

因此,“ Think Python”函数调用:

circle(bob, 100)

绘制一个半径为100的圆:

enter image description here

乌龟法:

bob.circle(100, 90)

根据半径100绘制 arc (1/4圆):

enter image description here

  

我不明白为什么需要n,以及该过程如何使   圈。

n是多边形上近似于圆形的边数:

n = int(circumference / 3 ) + 1
length = circumference / n
polygon(t, n, length)

从半径100开始,如果我们用1替换上面的'3',我们将得到一个具有更多(629)边的多边形:

n = int(circumference / 1) + 1  # n = 629
length = circumference / n  # length = 0.9989

或大致:

polygon(t, 628, 1)

如上所述。但是,如果将“ 3”替换为“ 27”,则会得到一个由24个边的多边形近似的圆:

n = int(circumference / 27 ) + 1  # n = 24
length = circumference / n  # length = 26.1799

enter image description here

原始的'3'值应该是一个附加参数-在turtle.circle()方法中,它大致等效于 steps 参数:

  

由于圆是由内接正则多边形近似的,       步骤确定要使用的步骤数。如果没有给出,       它将自动计算。可用于绘制常规       多边形。

bob.circle(100, steps=12)

enter image description here