gpt4 book ai didi

python - 理解 Think Python 中的示例代码如何像计算机科学家一样思考 4.3 ex 5

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:22 27 4
gpt4 key购买 nike

我很难理解为什么这本书的作者使用了一些代码行:

import math
import turtle

bob = turtle.Turtle()

def polyline(t, n, length, angle):
"""Draws n line segments.

t: Turtle object
n: number of line segments
length: length of each segment
angle: degrees between segments
"""
for i in range(n):
t.fd(length)
t.lt(angle)


def polygon(t, n, length):
"""Draws a polygon with n sides.

t: Turtle
n: number of sides
length: length of each side.
"""
angle = 360.0/n
polyline(t, n, length, angle)


def arc(t, r, angle):
"""Draws an arc with the given radius and angle.

t: Turtle
r: radius
angle: angle subtended by the arc, in degrees
"""
arc_length = 2 * math.pi * r * abs(angle) / 360
n = int(arc_length / 4) + 3
step_length = arc_length / n
step_angle = float(angle) / n

# making a slight left turn before starting reduces
# the error caused by the linear approximation of the arc
t.lt(step_angle/2)
polyline(t, n, step_length, step_angle)
t.rt(step_angle/2)


def circle(t, r):
"""Draws a circle with the given radius.

t: Turtle
r: radius
"""
arc(t, r, 90)

circle(bob, 100)

我在评论中强调了我感到困惑的地方。这些说明是在 Python 中使用海龟制作一个通用函数来绘制一个圆圈。我正在使用 Python 3.7,但我真的不认为这有什么不同。为什么作者在我放置第一个评论的地方使用 n?他从哪里得到那个公式?另外,其余注释代码背后的逻辑是什么?我理解其余的练习,如果我知道他是如何得到那个方程式的,我就会理解这个。

最佳答案

让我们逐行使用 arc 函数:

arc_length = 2 * math.pi * r * abs(angle) / 360

2 * math.pi * r 是圆的周长公式。 abs(angle)/360 告诉您您的路径将占圆周的比例。将它们相乘,就可以得到乌龟描述这条弧线需要移动的距离(假设它可以沿着弯曲的路径移动,我们只是近似)。

n = int(arc_length / 4) + 3

这是我们希望乌龟在接近圆周所描述的路径时所走的步数。它不必是这个特定的值;其他实现使用 int(arc_length/3) + 1 和其他值。 step_lengthstep_angle 都由它缩放,因此增加它会使每个步更小,并使单个步的旋转更小。忽略 float 学和累积舍入误差的问题,总行进距离和总旋转将保持不变。

step_length = arc_length / n
step_angle = float(angle) / n

我们的折线将为我们执行 n 步。在每一步中,我们都希望移动 1/narc_length 并旋转 1/n 我们的弧描述的总角度。如果我们在这两者之前的行中将 n 设置为较大的值,则 step_lengthstep_angle 将相应缩小。

至于其余的:

t.lt(step_angle/2)
polyline(t, n, step_length, step_angle) # take a lot of little steps
t.rt(step_angle/2)

这里的半圈是我们对圆弧近似的一个小改进。想一想我们在这里描述的路径,例如,沿着单位圆的 90 度弧,从 (1, 0) 开始,到 (0, 1) 结束,分 3 步。下面是单位圆本身位置的值表(理想 x、理想 y 和理想航向,其中理想航向是圆在该点的切线)、原始 x、原始 y 和原始航向,以及x、y 和航向通过在开始路径之前进行 step_angle/2 左转然后在之后进行 step_angle/2 右转以取消它来产生:

     |ideal x|ideal y|ideal heading|raw x|raw y|raw heading|adj x|adj y|adj heading|
------------------------------------------------------------------------------------
Start|1 |0 |90 |1 |0 |90 |1 |0 |105 |
Step1|0.86 |0.5 |120 |1 |0.52 |120 |0.86 |0.51 |135 |
Step2|0.5 |0.86 |150 |0.74 |0.98 |150 |0.49 |0.88 |165 |
Step3|0 |1 |180 |0.28 |1.24 |180 |-0.01|1.01 |195 |
End |0 |1 |180 |0.28 |1.24 |180 |-0.01|1.01 |180 |

请注意,调整后的值比原始值更接近理想值。当您考虑多段线的工作原理时,这在直觉上是有意义的:无论它面向什么方向,它都会向前移动,然后左转。当您从未调整的航向开始时,您甚至在尝试转弯之前就将 step_length 移动到圆弧上方。您将始终位于弧线的上方和右侧。首先向左转半 step_angle,您将在弧线下方花费每个 step_length 的一部分,在弧线上方花费每个 step_length 的一部分。与严格在弧外的弧相比,这将产生更好的弧近似值。

编辑:

关于你更新的 circle 方法的问题,它需要两个参数(海龟和圆的半径)然后相应地调用 arc 现在你的实现是:

def circle(t, r):
arc(t, r, 90)

其中 arc 的第三个参数是您希望移动的弧的角度。不过,要形成一个圆圈,您需要 360 度,而不是 90 度。

关于python - 理解 Think Python 中的示例代码如何像计算机科学家一样思考 4.3 ex 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55551889/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com