你的“圆”的半径应该是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')