APP下载

Python绘制标准国旗

2021-08-25王德贵

电脑报 2021年26期
关键词:锐角五角星五星

王德贵

我们曾经用Python绘制了党旗,也用Scratch绘制过国旗。不过在Python中绘制标准国旗并不简单,我们采用的方法在数学上称为解析法。

一、准备工作

1.国旗标准图案及分析

把整个国旗换成直角坐标系,中心坐标为(0,0)。每个小格边长20,则国旗左上角坐标为(-300,200),国旗长600、高400。五星所在的区域为第二象限,横坐标为负,纵坐标为正。

大五星是正立放置的,而4颗小五星则是顶点中心轴线正对着大五星的中心,即是大五星中心、小五星中心和小五星顶点在一条直线上,而且上下1、4两颗和右侧2、3两颗是关于第五个横格对称的。

2.五星的坐标及相关参数

设定坐标的标度为每个小格20,大五星的中心坐標为(-200,100),半径60,顶点坐标为(-200,160)。

小五星的半径为20。4个小五星中心坐标分别为(-100,160)、(-60,120)、(-60,60)、(-100,20)。

大五星顶点中心正上方,横向长度为0,纵向为3。小五星对应大五星中心相对横纵长度(x,y)分别为(5,3)、(7,1)、(7,-2)、(5,-4)。负值表示在相对中心的下方。

3.三角函数及反三角函数

小五星的顶点要正对着大五星的中心,所以需要知道小五星顶点中心轴的方向角。具体算法从略,我在源代码中做了简单的注释。

二、程序设计

1.导入Turtle库和Math库

Turtle是小海龟绘图库,Math是数学库,我们要用到里面的三角函数和反三角函数,以及圆周率pi值。from导入方法能使程序简化一点,详细作用请参考其他资料。

2.国旗外围框

3.大五星

大五星的起始点,我们能最准确得到的,就是上面的顶点,坐标为(-300,200),其他顶点均不是整数。这个顶点要画五角星,需要向斜下方开始画,我们使用绝对角度setheading()设置小海龟的方向。

大五星的直径为120,顶角为360,绿色直角三角形中,斜边是直径,上侧锐角为180(蓝色箭头所指),所以移动的步数为直角三角形中180角的邻边,即120*cos(18*pi/180),这里注意18度角要转换为弧度制,所以要乘以π,除以180。Turtle运动方向为图中白色箭头方向。

4.四个小五星

(1)1号小五星中心相对大五星中心,横x=5格,纵y=3格,那么这个锐角的正切值tanA=y/x=3/5,数学上这个锐角的大小为arctan3/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.更新程序并测试

通过大五星和1号小五星调用自定义函数进行反复测试。

2.完成全部代码

测试成功后补全其他小五星参数。设置速度,可以利用(speed())函数,速度值从 1 到 10,画线和海龟转向的动画效果逐级加快。

3.总结

本以为很简单的程序,没想到涉及了不少三角函数的相关知识,在Turtle坐标的定义和高中数学是完全一致的。这更有助于学生的学习。

猜你喜欢

锐角五角星五星
拼五角星
五星连珠
爱你五星红旗我
锐角寻亲记
一群人的狂欢
酸酸甜甜的“五角星”
考眼力
画角数角收获大
五角星
最大的锐角是多少度?