如何找到使用Turtle Python Graphics绘制的圆的半径?

时间:2016-04-11 16:25:57

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

这是我的代码:

flex: 1

结果如下图所示:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

你有几个选择。

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

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

或者,使用bob.pos来获取圆圈开始处的龟坐标以及完成180步后的龟坐标,因为这些点将位于圆的直径的两端。

这样做的简单方法是将你的循环分成两个循环,每个循环绘制一半圆圈。

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

答案 1 :(得分:0)

“圆”的半径应为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作为您的近似半径(以像素为单位)。


附录

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

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')