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

4
这是我的代码:
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()

这导致了以下绘图:

enter image description here

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


1
如果我们假设每个线段的长度为1像素,那么周长就是360像素,这意味着半径为360 = 2 * π * r,因此r = 180 / π - Barış Uşaklı
2个回答

1
你有几个选项。
圆的周长大约等于步长乘以步数,即360像素。
因此,半径= 360 /(2 * pi)
或者,使用 bob.pos 获取海龟在圆的开始和完成180步时的坐标,因为这些点将位于圆的直径的两端。
简单的方法是将循环分成两个循环,每个循环画一半的圆。
您可以使用勾股定理找到这两个点之间的距离。

1
由于海龟在学校里学习了毕达哥拉斯定理,因此您可以在行驶半圆后简单地执行bob.distance(0, 0)(或者Bob从哪里开始他的旅程),来得到当前位置与起点的距离。 - cdlane

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接