Tes*_*Tes 2 python turtle-graphics python-turtle
我今天在一个学习小组遇到了一个挑战,要在 python 海龟库中绘制这个形状。
我想不出一种表达几何解的方法来找到我需要的转弯角度和线的大小。
你能告诉我如何单独绘制第一个多边形吗?我已经知道如何制作图案了。
我在五年级。所以请给我一个我能理解的解决方案。
这是我想出的解决方案。它基于此图:
我的解决方案使用“三角学”,这是一种从另一边的长度和三角形的角度计算三角形的一条边的长度的方法。这是我希望在 9 年级或 10 年级教授的高级数学。我不希望 5 年级的人知道三角学。我也无法解释三角学的每一个细节,因为我必须写很多,而且我认为我没有教学技巧来把它说清楚。我建议您查看例如此视频以了解该方法:
https://www.youtube.com/watch?v=5tp74g4N8EY
你也可以向你的老师询问更多信息,或者自己在互联网上研究它。
我们可以在没有三角函数的情况下做到这一点。
首先,我们看到中间有一个“五边形”(5 边多边形)。我想知道这个“五边形”中一个角的内角。我称这个角度为X:
我们如何计算角度X?我们首先记住三角形的内角和是180°。我们看到我们可以将一个 5 边的多边形划分成这样的5-2三角形:
每个5-2三角形的内角和是180°。因此,对于整个 5 边多边形,内角之和为180° * (5-2)。由于所有角的大小相同,因此每个角都是180°*(5-2) / 5 = 108°。所以我们有X = 108°.
另一侧的角度与 相同X。这允许我们计算两者之间的角度X。我会称这个角度为Y:
既然是一个完整的圆360°,我们就知道了360° = 2*X + 2*Y。因此,Y = (360° - 2*X) / 2。我们知道X = 108°,所以我们得到Y = 72°。
接下来,我们看到有一个包含Y角的三角形。我想知道Z三角形另一个角的角度:
三角形的内角和为180°*(3-2) = 180°。因此,我们知道180° = 2*Y + Z,所以Z = 180° - 2*Y。我们知道Y = 72°,所以我们得到Z = 36°。
我们会经常使用这个角度Z。可以看到绿色星星的每个角落都有角度Z。蓝星与绿星相同,只是它旋转了,所以所有的蓝角也都有角度Z。红星的角是绿星和蓝星的角的两倍宽,所以红星的角有角2*Z。
首先,我们观察到所有外角都在一个圆上。我们称这个圆的半径为R。我们不必计算R。相反,我们可以为 取任何我们想要的值R。我们总是会得到相同的形状,但大小不同。我们可以称之为R形状的“参数”。
给定一些价值 R,我想知道以下长度:
A:我们从A. 我们可以看到下面的三角形:
三角形的长边是我们的半径R。另一边有长度A/2,我们不关心第三边。最右上角的角度是Z/2(Z = 36°我们在上一节中计算的角度)。角S是直角,所以S = 90°。我们可以计算第三个角,T因为我们知道三角形的内角和为180°。因此,180° = S + Z/2 + T。求解T,我们得到T = 180° - S - Z/2 = 180° - 90° - 36°/2 = 72°。
接下来,我们使用三角函数来计算A/2。三角学告诉我们A/2 = R * sin(T)。代入 的公式T,我们得到A/2 = R * sin(72°)。求解A,我们得到A = 2*R*sin(72°)。
R例如R = 100,如果您为 选择一些值,您现在可以A使用此公式进行计算。你需要一个计算器sin(72°),因为在你的头脑中计算这个是非常困难的。把sin(72)到我的计算器给我0.951056516。所以对于我们的选择R = 100,我们知道A = 2 * R * sin(72°) = 2 * 100 * 0.951056516 = 190.211303259。
B:我们使用相同的技术来找到 的公式B。我们看到下面的三角形:
所以底边是我们半径的长度R。右边是B/2。我们不在乎第三面。最右边的角度是三倍Z/2。这个角S是直角,所以我们有S = 90°。我们可以计算出剩余角度T用180° = S + T + 3*Z/2。求解T,我们得到T = 180° - S - 3*Z/2 = 180° - 90° - 3*36°/2 = 36°。好的T = Z,我们也可以从图片中看到这一点,但现在我们已经计算了它。
使用三角学,我们知道B/2 = R * sin(T),所以我们得到了B = 2 * R * sin(36°)计算B某些选择的公式R。
C:我们看到下面的三角形:
所以底边有长度 A/2,顶边有 length B。我们已经为这两个方面制定了公式。第三面是C,我们想找到一个公式。最右边的角是Z。角S是直角,所以S = 90°。最上面的角度是三倍Z/2。
使用三角函数,我们得到C = sin(Z) * B。
D:我们看到下面的三角形:
我们已经有了一个公式 C。我们想找到一个公式D。最上面的角度是Z/2(我无法将文本放入三角形中)。左下角S是直角。
使用三角学,我们知道D = tan(Z/2) * C。该tan功能类似于sin前面公式中。您可以再次将其放入计算器来计算值,因此对于Z = 36°,我可以将其tan(36/2)放入计算器中,它会给出0.324919696。
E:好的,这很容易, E = 2*D。
已经完成一半了!
F:这类似于A和B:
我们想找到一个公式F。顶边的长度为F/2。底边的长度是我们的半径R。最右边的角有角Z。S是直角。我们可以计算T = 180° - S - Z = 180° - 90° - Z = 90° - Z。
使用三角函数,我们得到F/2 = R * sin(T)。放入公式T给我们F/2 = R*sin(90° - Z)。解决F给我们F = 2*R*sin(90°-Z)。
G:我们看到下面的三角形:
顶边有 length F,我们已经知道了它的公式。右边有 length G,我们想为它找到一个公式。我们不关心底部。最左角的角为Z/2。最右边的角有角2*Z。底角有角S,是直角,所以S = 90°。对我来说,红线和绿线完全垂直于彼此并不是很明显,所以这S确实是一个直角,但是您可以使用三角形内角的公式来验证这一点,它为您提供180° = Z/2 + 2*Z + S. 求解 forS给了我们S = 180° - Z/2 - 2*Z。使用Z = 36°,我们得到S = 180° - 36°/2 - 2* 36° = 90°。
使用三角函数,我们得到 G = F * sin(Z/2)。
H:我们看到下面的三角形:
右边有 length G,我们已经有了这个公式。底边有 length H,我们想找到一个公式。我们不在乎第三面。顶角有角Z,右下角有角S。我们已经知道这S是上一节的直角。
使用三角函数,我们得到H = G * tan(Z)。
I:这很简单,I与A. 我们可以看到A可以分为A = I + H + E + H + I. 我们可以将其简化为A = 2*I + 2*H + E. 求解 forI给了我们I = (A - 2*H - E)/2。
J:同样,这很容易,J与F. 我们可以看到F可以分为F = G + J + G. 我们可以将其简化为F = 2*G + J. 求解 forJ给了我们J = F - 2*G。
我们现在有我们感兴趣的所有行的公式!我们现在可以将这些放入 Python 程序中来绘制图片。
Python 为您提供了用于计算sin和tan. 它们包含在math模块中。所以你会添加import math到你的程序的顶部,然后你就可以在你的程序中使用math.sin(...)和math.tan(...)了。但是,存在一个问题:这些 Python 函数不使用度数来测量角度。相反,他们使用称为“弧度”的不同单位。幸运的是,在度和弧度之间转换很容易:以度为单位,一个完整的圆是360°。以弧度表示,一个完整的圆是2*pi,其中pi是一个特殊的常数,大约是3.14159265359...。因此,我们可以将以度为单位的角度转换为以弧度为单位的角度,方法是将角度除以360°然后乘以2*pi。我们可以在 Python 中编写以下辅助函数:
import math
def degree_to_radians(angle_in_degrees):
full_circle_in_degrees = 360
full_circle_in_radians = 2 * math.pi
angle_in_radians = angle_in_degrees / full_circle_in_degrees * full_circle_in_radians
return angle_in_radians
def sin_from_degrees(angle_in_degrees):
angle_in_radians = degree_to_radians(angle_in_degrees)
return math.sin(angle_in_radians)
def tan_from_degrees(angle_in_degrees):
angle_in_radians = degree_to_radians(angle_in_degrees)
return math.tan(angle_in_radians)
Run Code Online (Sandbox Code Playgroud)
现在我们可以用我们的功能sin_from_degrees,并tan_from_degrees以计算sin并tan从衡量度角。
把它们放在一起:
from turtle import *
import math
# Functions to calculate sin and tan ###########################################
def degree_to_radians(angle_in_degrees):
full_circle_in_degrees = 360
full_circle_in_radians = 2 * math.pi
angle_in_radians = angle_in_degrees / full_circle_in_degrees * full_circle_in_radians
return angle_in_radians
def sin_from_degrees(angle_in_degrees):
angle_in_radians = degree_to_radians(angle_in_degrees)
return math.sin(angle_in_radians)
def tan_from_degrees(angle_in_degrees):
angle_in_radians = degree_to_radians(angle_in_degrees)
return math.tan(angle_in_radians)
# Functions to calculate the angles ############################################
def get_X():
num_corners = 5
return (num_corners-2)*180 / num_corners
def get_Y():
return (360 - 2*get_X()) / 2
def get_Z():
return 180 - 2*get_Y()
# Functions to calculate the lengths ###########################################
def get_A(radius):
Z = get_Z()
return 2 * radius * sin_from_degrees(90 - Z/2)
def get_B(radius):
Z = get_Z()
return 2 * radius * sin_from_degrees(90 - 3*Z/2)
def get_C(radius):
Z = get_Z()
return sin_from_degrees(Z) * get_B(radius)
def get_D(radius):
Z = get_Z()
return tan_from_degrees(Z/2) * get_C(radius)
def get_E(radius):
return 2 * get_D(radius)
def get_F(radius):
Z = get_Z()
return 2 * radius * sin_from_degrees(90 - Z)
def get_G(radius):
Z = get_Z()
return get_F(radius) * sin_from_degrees(Z/2)
def get_H(radius):
Z = get_Z()
return get_G(radius) * tan_from_degrees(Z)
def get_I(radius):
A = get_A(radius)
E = get_E(radius)
H = get_H(radius)
return (A - E - 2*H) / 2
def get_J(radius):
F = get_F(radius)
G = get_G(radius)
return F - 2*G
# Functions to draw the stars ##################################################
def back_to_center():
penup()
goto(0, 0)
setheading(0)
pendown()
def draw_small_star(radius):
penup()
forward(radius)
pendown()
Z = get_Z()
left(180)
right(Z/2)
E = get_E(radius)
H = get_H(radius)
I = get_I(radius)
for i in range(0,5):
penup()
forward(I)
pendown()
forward(H)
penup()
forward(E)
pendown()
forward(H)
penup()
forward(I)
left(180)
right(Z)
back_to_center()
def draw_green_star(radius):
pencolor('green')
draw_small_star(radius)
def draw_blue_star(radius):
pencolor('blue')
Z = get_Z()
left(Z)
draw_small_star(radius)
def draw_red_star(radius):
pencolor('red')
Z = get_Z()
penup()
forward(radius)
pendown()
left(180)
right(Z)
G = get_G(radius)
J = get_J(radius)
for i in range(0,10):
pendown()
forward(G)
penup()
forward(J)
pendown()
forward(G)
left(180)
right(2*Z)
back_to_center()
def draw_shape(radius):
draw_green_star(radius)
draw_blue_star(radius)
draw_red_star(radius)
radius = 400
draw_shape(radius)
done()
Run Code Online (Sandbox Code Playgroud)
输出:
import turtle
#turtle.tracer(0)
a = turtle.Turtle()
for _ in range(10):
a.forward(100)
a.right(90)
a.forward(73)
a.right(72)
a.forward(73)
a.backward(73)
a.right(108)
a.forward(73)
a.right(90)
a.penup()
a.forward(100)
a.pendown()
a.forward(100)
a.right(108)
#turtle.update()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |