汪德贵
我们以前用Python画党旗,用Scratch画国旗。但是,用Python画标准旗并不容易。我们采用的方法在数学上叫做分析法。一.准备工作
1.国旗标准图案及分析
1.国旗的标准设计与分析
把整个国旗换成直角坐标系,中心坐标为(0,0)。如果每个单元格的边长为20,国旗左上角坐标为(-300,200),国旗长600,高400。五星所在的区域为第二象限,负横坐标,正纵坐标。
大五星直立放置,四个小五星是面向大五星中心的顶点的中轴,即大五星的中心、小五星的中心和小五星的顶点在一条直线上,上下1、4和右2、3关于第五个横格对称。
2.五星坐标及相关参数
将每个单元格的坐标刻度设置为20,大五星的中心坐标为(-200,100),半径为60,顶点坐标为(-200,160)。
小五星的半径是20。四颗小五星的中心坐标分别为(-100,160)、(-60,120)、(-60,60)、(-100,20)。
在大五星顶点的正上方,水平长度为0,垂直长度为3。大五星对应的小五星中心的相对水平和垂直长度(x,y)分别为(5,3),(7,1),(7,-2),(5,-4)。负值低于相对中心。
3.三角函数和反三角函数
小五星的顶点要对着大五星的中心,所以你需要知道小五星顶点的中轴线的方向角。具体算法省略了,我在源代码里做了简单的注释。二、程序设计
1.导入海龟库和数学库
Turtle是小海龟绘图库,Math是数学库,我们要用到里面的三角函数和反三角函数,以及圆周率pi值。from导入方法能使程序简化一点,详细作用请参考其他资料。
Turtle是小乌龟画图库,Math是数学库。我们需要用到三角函数和反三角函数,以及pi值。从中导入的方法可以简化程序。详情请参考其他资料。
2.国旗外框
3.大五星
3.大五星
大五星的起始点,我们能最准确得到的,就是上面的顶点,坐标为(-300,200),其他顶点均不是整数。这个顶点要画五角星,需要向斜下方开始画,我们使用绝对角度setheading()设置小海龟的方向。
大五星的起点,我们能得到最准确的是顶顶点,它的坐标是(-300,200),其他顶点都不是整数。要在这个顶点画五角星,需要斜向下画。我们用绝对角度setheading()来设定小乌龟的方向。
大五星直径120,顶角360。在一个绿色的直角三角形中,斜边为直径,上锐角为180°(蓝色箭头表示),所以移动步数为直角三角形中180°角的邻边,即120*cos(18*pi/180)。这里注意18度角要换算成弧系,所以乘以π再除以180。乌龟朝图中白色箭头的方向移动。
4.四颗小五星
(1)1号小五星中心相对比五星中心大,横向x=5格,纵向y=3格。那么这个锐角的正切tanA=y/x=3/5。数学上,这个锐角的大小是反正切3/5。右转18度就是白线箭头所指的方向。
Python中有两个反正切函数,atan(x)和atan2(y,x)。两者的区别在于,第一个函数只需要一个参数,比如atan(3/5),而第二个函数需要两个参数atan2 (3,5)。那么它们之间的区别是什么呢?是正切函数的定义域问题。在90度时,正切值没有意义,即atan(3/0)没有意义,不能返回90度的角度值,而atan2 (3,0)可以返回90度的值。所以我们用第二个函数来求解。
因为乌龟的起始角度很难计算,所以使用了绝对角度setheading(),这样可以精确计算出乌龟的方向。
(2)其他的2号、3号、4号五星和1号五星类似,就是起始位置和比较大的五星的中心和横纵长度不一样,所以程序是重复的。我们可以把重复的代码封装起来,在每次画五星的时候调用。这是一个自定义函数。
5.自定义功能
画小五星需要五角星的中心坐标、外接圆半径和所画五角星相对大五星中心的横纵长度。因而封装的函数,需要这5个参数。
画小五星需要五星的圆心坐标和外接圆半径,以及所画五星的圆心相对于大五星的水平和垂直长度。因此,封装的函数需要这五个参数。
三。整体测试
1.更新程序并测试它通过大五星和小五星一号调用自定义函数进行反复测试。
2.完成所有代码。
测试成功后完成其他小五星参数。设置速度,可以使用(speed())函数,速度值从1到10,逐步加速画线和乌龟转弯的动画效果。
3.摘要
我以为是个简单的程序,没想到涉及到很多三角函数的知识。乌龟坐标的定义和高中数学完全一致。这样更有利于学生的学习。
评论列表()