上一篇介绍了五星红旗的画法
顺路做一个升旗的动画
绘制红旗还是使用上一篇的代码,只是做了少量更改。
动画原理:
动画会动吗?
其实它不会
动画的原理是眼睛的视觉驻留
物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象。是人眼具有的一种性质。人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。但当物体移去时,视神经对物体的印象不会立即消失,而要延续0.1 -0.4秒的时间,人眼的这种性质被称为“眼睛的视觉暂留”。
所以,我们看到的物体运动只是眼睛捕捉到的静态图像在加上大脑的运算合成出的动态影像.
根据这样的原理,动画的制作就是以下步骤
1.画一张静态图像
2.等待一段时间(小于视觉驻留的持续时间)
3.清除图像
4.再画一幅相同的静态图像,但位置要有些许偏移
5.等待..清除..绘制
在turtle模块提供了tracer方法和delay方法,控制屏幕刷新及延时,还有clear()方法清除图像.
利用这些方法就可以制作出动画的效果.
升旗的效果如下:
代码如下:
import time
from turtle import *
from The_Five_starred_Red_Flag import China_Flag
screensize(600, 600) # 画布大小
bgcolor('black') # 背景颜色为黑色
hideturtle()
tracer(48)
# 画旗杆
t = Turtle()
t.color('white')
t.up()
t.goto(-200,-190)
t.down()
t.begin_fill()
t.seth(90)
t.goto(-200,300)
t.lt(90)
t.fd(10)
t.lt(90)
t.goto(-210,-190)
t.lt(90)
t.fd(10)
t.end_fill()
t.hideturtle()
# 升旗动画
for i in range(150):
China_Flag(192,-200,-190+i*2)
tracer(48)
time.sleep(0.05)
if i != 149:
clear()
done()
绘制五星红旗的代码如下:
The_Five_starred_Red_Flag.py
# 绘制五星红旗
"""
国旗制法说明
(1949年9月28日中国人民政治协商会议第一届全体会议主席团公布)
国旗的形状、颜色两面相同,旗上五星两面相对。为便利计,本件仅以旗杆在左之一面为说明之标准。
对于旗杆在右之一面,凡本件所称左均应改右,所称右均应改左。
(一)旗面为红色,长方形,其长与高为三与二之比,旗面左上方缀黄色五角星五颗。一星较大,
其外接圆直径为旗高十分之三,居左;四星较小,其外接圆直径为旗高十分之一,环拱于大星之右。
旗杆套为白色。
(二)五星之位置与画法如下:
甲、为便于确定五星之位置,先将旗面对分为四个相等的长方形,将左上方之长方形上下划为十等分,
左右划为十五等分。
乙、大五角星的中心点,在该长方形上五下五、左五右十之处。其画法为:以此点为圆心,
以三等分为半径作一圆。在此圆周上,定出五个等距离的点,其一点须位于圆之正上方。
然后将此五点中各相隔的两点相联,使各成一直线。此五直线所构成之外轮廓线,
即为所需之大五角星。五角星之一个角尖正向上方。
丙、四颗小五角星的中心点,第一点在该长方形上二下八、左十右五之处,第二点在上四下六、
左十二右三之处,第三点在上七下三、左十二右三之处,第四点在上九下一、左十右五之处。
其画法为:以以上四点为圆心,各以一等分为半径,分别作四个圆。在每个圆上各定出五个等距离的点,
其中均须各有一点位于大五角星中心点与以上四个圆心的各联结线上。然后用构成大五角星的同样方法,
构成小五角星。此四颗小五角星均各有一个角尖正对大五角星的中心点。
(三)国旗之通用尺度定为如下五种,各界酌情选用:
甲、长288公分,高192公分。
乙、长240公分,高160公分。
丙、长192公分,高128公分。
丁、长144公分,高96公分。
戊、长96公分,高64公分。
"""
from turtle import *
def star(center_point,first_vertex,radius):
"""根据圆心坐标及其第一个顶点坐标绘制五角星"""
up()
seth(0)
goto(center_point)
angle = towards(first_vertex)
goto(first_vertex)
lt(angle)
rt(90)
# 确定五个顶点坐标
five_vertex_points = [first_vertex]
for _ in range(4):
circle(-radius,360/5)
five_vertex_points.append(pos())
# 开始绘制五角星
goto(first_vertex)
color('yellow')
down()
begin_fill()
for index in range(len(five_vertex_points)):
goto(five_vertex_points[(index*2)%len(five_vertex_points)])
goto(first_vertex)
end_fill()
def China_Flag(height,start_x = None,start_y = None):
tracer(0)
# 设置高宽
width = (height / 2) * 3
if start_x is None and start_y is None:
# 设置绘制起点
start_x = -(width/2)
start_y = -(height/2)
up()
goto(start_x,start_y)
down()
# 绘制矩形旗面
setheading(0)
color('red')
begin_fill()
for i in range(2):
fd(width)
lt(90)
fd(height)
lt(90)
end_fill()
# 确定五颗星的中心坐标
five_star_center_points = [(start_x+width/2/15*5,start_y+(1/2+5/20)*height),
(start_x+width/2/15*10,start_y+(1/2+8/20)*height),
(start_x+width/2/15*12,start_y+(1/2+6/20)*height),
(start_x+width/2/15*12,start_y+(1/2+3/20)*height),
(start_x+width/2/15*10,start_y+(1/2+1/20)*height),]
# 确定五颗星的第一个顶点坐标
big_radius = height/2/10*3 # 大五星外接圆半径
small_radius = height/2/10 # 小五星外接圆半径
up()
goto(five_star_center_points[0])
setheading(90)
fd(big_radius)
p = pos()
first_vertex_points = [p] # 第一个顶点坐标
for point in five_star_center_points[1:]:
goto(point)
seth(0)
angle = towards(five_star_center_points[0])
lt(angle)
fd(small_radius)
first_vertex_points.append(pos())
up()
# 绘制五角星
# 大五角星
star(five_star_center_points[0], first_vertex_points[0], big_radius)
# 4个小五角星
for i in range(1,5):
star(five_star_center_points[i],first_vertex_points[i],small_radius)
if __name__ == '__main__':
screensize(600, 400) # 画布大小
bgcolor('black') # 背景颜色为黑色
speed(0) # 速度为最快
China_Flag(192,50,15)
hideturtle()
done()
35岁学python,也不直到为了啥?