【问题标题】:How to find the radius of a circle drawn using Turtle Python Graphics?如何找到使用 Turtle Python Graphics 绘制的圆的半径?
【发布时间】:2016-04-11 16:25:56
【问题描述】:

这是我的代码:

import turtle

bob = turtle.Turtle()   # Creating the object "bob"

def draw_circle(t):
    for i in range (360):   # Loop for drawing a circle
        t.fd(1) # Draw a line with the length of 1 pixel in the forward direction
        t.lt(1) # Turn 1 degree to the left

draw_circle(bob)
turtle.mainloop()

结果如下图:

所以我的问题是我如何测量这个圆的半径(以像素为单位),知道圆是通过重复绘制 1 像素线然后 1 度转弯 360 次来绘制的?强>

【问题讨论】:

  • 如果我们可以假设每个段的长度是 1 像素,这意味着圆周是 360 像素,这意味着半径是 360 = 2 * π * r 所以 r = 180 / π

标签: python python-3.x turtle-graphics


【解决方案1】:

你有几个选择。

圆的周长(大致)等于步长乘以步数,即 360 像素。

所以半径 = 360 / (2 * pi)

或者,使用bob.pos 获取海龟在圆开始处的坐标,当它完成 180 步时,因为这些点将位于圆直径的两端。

简单的方法是将你的循环分成两个循环,每个循环画半个圆。

您可以使用毕达哥拉斯定理找出这两点之间的距离。

【讨论】:

  • 因为海龟是在学校里学习毕达哥拉斯的,所以你可以在跑完半圈后简单地做bob.distance(0, 0)(或鲍勃开始他的旅程的任何地方)。
【解决方案2】:

你的“圆”的半径应该是57.28996163075943像素,可以这样计算:

import math
radius = math.sin(math.radians(89)) / math.sin(math.radians(1))
print('Radius of circle =', radius)

之所以如此,是因为您的圈子并不是真正的圈子。它由360个不同的三角形组成。特别是,它们都是 ASA(角、边、角)三角形。让我们假设当开始画你的圆时,你的乌龟从圆的切线开始。这意味着如果您要绘制一条穿过您正在绘制的圆的中心和正在绘制的海龟的线,那么您的海龟的方向将垂直于该线。因此,我们可以这样说:

angle_a = 90

我们说我们知道的三角形中第一个角度是 90 度。我们需要的下一条信息是边的长度。由于海龟画了一条 1 像素的线,我们知道这是长度,可以将其添加到我们的注释中:

angle_a = 90
side_c = 1

我们需要知道的最后一件事是多一个角度。现在这必须从以前的知识中推导出来,因为一开始它可能并不明显。在每个绘图步骤开始时,我们的乌龟平行于圆上的切线;这意味着在将乌龟转动 1 度后,它已准备好开始下一个绘图步骤,并且必须在切线上。因此,在绘制步骤结束时,应该可以通过沿着垂直于海龟所面对方向的路径将一条线追溯到圆的中间。由于转了 1 度,我们知道我们正在制作的三角形的另一个角度必须是 89 度。

angle_a = 90
side_c = 1
angle_b = 89

由此我们可以得出结论,三角形中圆心的另一个角一定是1度。

angle_a = 90
side_c = 1
angle_b = 89
angle_c = 1

现在我们已经掌握了所有这些信息,我们可以使用正弦定律找出三角形另外两条边的长度。我们会得到两个不同的值。首先是a边的长度,斜边;第二个是b边的长度,半径。您会注意到较长的长度是海龟在第一次绘制步骤后离圆心的距离。为了计算半径,我选择了几乎没有任何不同的第二次测量。

是时候解一些公式了:

side_a / sin(angle_a) = side_c / sin(angle_c)
side_a / sin(90) = 1 / sin(1)
side_a = sin(90) / sin(1)

side_a = math.sin(math.radians(90)) / math.sin(math.radians(1))  # hypotenuse

side_b / sin(angle_b) = side_c / sin(angle_c)
side_b / sin(89) = 1 / sin(1)
side_b = sin(89) / sin(1)

side_b = math.sin(math.radians(89)) / math.sin(math.radians(1))  # radius

您也可以选择对边 a 和 b 的长度进行平均,以获得更好的圆半径近似值:

print('Radius of circle =', (side_a + side_b) / 2)

由此,您将得到57.29432506465481 作为您的近似半径(以像素为单位)。


附录

在对此事进行了更多研究之后,很容易开发一个功能来帮助将来更轻松地解决此类问题。请注意,多边形不一定有直径,但偶数边的多边形至少有两个相互平行的半径。使用以下函数获取半径就像将其结果除以 2 一样简单。包含示例用法:

import math


def get_polygon_diameter(side_length, side_rotation):
    return side_length / math.sin(math.pi * side_rotation / 360)


length_of_each_side = 1  # in pixels
rotation_per_side = 1    # in degrees
diameter = get_polygon_diameter(length_of_each_side, rotation_per_side)
radius = diameter / 2
print(f'Radius of "circle" that is actually a polygon = {radius:.3f} pixels')

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多