如何找到使用 Turtle Python Graphics 绘制的圆的半径?
How to find the radius of a circle drawn using Turtle Python Graphics?
这是我的代码:
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 像素的线然后 360 度旋转 1 度而绘制的次?
你有几个选择。
圆的周长(大致)等于步长乘以步数,即 360 像素。
所以半径 = 360 / (2 * pi)
或者,使用 bob.pos
获取乌龟在圆的起点和完成 180 步后的坐标,因为这些点将位于圆直径的两端。
做到这一点的简单方法是将循环分成两个循环,每个循环绘制一半的圆。
您可以使用毕达哥拉斯定理求出这两点之间的距离。
你的 "circle" 的半径应该是 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')
这是我的代码:
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 像素的线然后 360 度旋转 1 度而绘制的次?
你有几个选择。
圆的周长(大致)等于步长乘以步数,即 360 像素。
所以半径 = 360 / (2 * pi)
或者,使用 bob.pos
获取乌龟在圆的起点和完成 180 步后的坐标,因为这些点将位于圆直径的两端。
做到这一点的简单方法是将循环分成两个循环,每个循环绘制一半的圆。
您可以使用毕达哥拉斯定理求出这两点之间的距离。
你的 "circle" 的半径应该是 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')