- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很难理解为什么这本书的作者使用了一些代码行:
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_length
和 step_angle
都由它缩放,因此增加它会使每个步更小,并使单个步的旋转更小。忽略 float 学和累积舍入误差的问题,总行进距离和总旋转将保持不变。
step_length = arc_length / n
step_angle = float(angle) / n
我们的折线将为我们执行 n
步。在每一步中,我们都希望移动 1/n
的 arc_length
并旋转 1/n
我们的弧描述的总角度。如果我们在这两者之前的行中将 n
设置为较大的值,则 step_length
和 step_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/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Sample data for IPv6? 除了 wireshark 在其网站上提供的内容之外,是否有可以下
我正在寻找可以集成到现有应用程序中并使用多拖放功能的示例或任何现成的解决方案。我在互联网上找到的大多数解决方案在将多个项目从 ListBox 等控件拖放到另一个 ListBox 时效果不佳。谁能指出我
我是 GATE Embedded 的新手,我尝试了简单的示例并得到了 NoClassDefFoundError。首先我会解释我尝试了什么 在 D:\project\gate-7.0 中下载并提取 Ga
是否有像 Eclipse 中的 SWT 示例那样的多合一 JFace 控件示例?搜索(在 stackoverflow.com 上使用谷歌搜索和搜索)对我没有帮助。 如果它是一个独立的应用程序或 ecl
我找不到任何可以清楚地解释如何通过 .net API(特别是 c#)使用谷歌计算引擎的内容。有没有人可以指点我什么? 附言我知道 API 引用 ( https://developers.google.
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
我正在尝试为我的应用程序设计配置文件格式并选择了 YAML。但是,这(显然)意味着我需要能够定义、解析和验证正确的 YAML 语法! 在配置文件中,必须有一个名为 widgets 的集合/序列。 .这
你能给我一个使用 pysmb 库连接到一些 samba 服务器的例子吗?我读过有类 smb.SMBConnection.SMBConnection(用户名、密码、my_name、remote_name
linux服务器默认通过22端口用ssh协议登录,这种不安全。今天想做限制,即允许部分来源ip连接服务器。 案例目标:通过iptables规则限制对linux服务器的登录。 处理方法:编
我一直在寻找任何 PostProjectAnalysisTask 工作代码示例,但没有看。 This页面指出 HipChat plugin使用这个钩子(Hook),但在我看来它仍然使用遗留的 Po
我发现了 GWT 的 CustomScrollPanel 以及如何自定义滚动条,但我找不到任何示例或如何设置它。是否有任何示例显示正在使用的自定义滚动条? 最佳答案 这是自定义 native 滚动条的
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
我需要一个提交多个单独请求的 django 表单,如果没有大量定制,我找不到如何做到这一点的示例。即,假设有一个汽车维修店使用的表格。该表格将列出商店能够进行的所有可能的维修,并且用户将选择他们想要进
我有一个 Multi-Tenancy 应用程序。然而,这个相同的应用程序有 liquibase。我需要在我的所有数据源中运行 liquibase,但是我不能使用这个 Bean。 我的应用程序.yml
我了解有关单元测试的一般思想,并已在系统中发生复杂交互的场景中使用它,但我仍然对所有这些原则结合在一起有疑问。 我们被警告不要测试框架或数据库。好的 UI 设计不适合非人工测试。 MVC 框架不包括一
我正在使用 docjure并且它的 select-columns 函数需要一个列映射。我想获取所有列而无需手动指定。 如何将以下内容生成为惰性无限向量序列 [:A :B :C :D :E ... :A
$condition使用说明和 $param在 findByAttributes在 Yii 在大多数情况下,这就是我使用 findByAttributes 的方式 Person::model()->f
我在 Ubuntu 11.10 上安装了 qtcreator sudo apt-get install qtcreator 安装的版本有:QT Creator 2.2.1、QT 4.7.3 当我启动
我是一名优秀的程序员,十分优秀!