“圆”的半径应该是57.28996163075943像素,可以这样计算:import math
radius = math.sin(math.radians(89)) / math.sin(math.radians(1))
print('Radius of circle =', radius)
之所以是真的,是因为你的圈子其实不是一个圈子。它由360个不同的三角形组成。尤其是,它们都是(角,边,角)三角形。让我们假设当你开始画圆的时候,你的乌龟从圆的切线开始。这意味着,如果你画一条线,穿过你画的圆的中心和画这幅画的乌龟,你的乌龟的方向将垂直于这条线。因此,我们可以说:
^{pr2}$
我们说的是,我们所知道的三角形的第一个角是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')