最近被《野狼disco》洗脑了,其中一句歌词已经印在了我深深的脑海里。
“来 左边 跟我一起画彩虹
在你右边 再画个龙”
那么今天就用python的turtle这个包, 来跟我一起画彩虹。先来缕一缕思路。
据毛泽东《菩萨蛮·大柏地》记载,
“赤橙黄绿青蓝紫,
谁持彩练当空舞?”
那么彩虹由七种不同的颜色构成,赤,橙,黄,绿,青,蓝,紫。
所以我们需要画七条彩带。具体可以用到前面构建的arc函数来画弧线,两条平行的弧线可以构成一条彩带。彩带的宽度就是两条弧线半径的差值。将这个过程重复七次就能得到七彩虹。
下面来看具体代码
import turtle
import math
# 画多个短线段,这个函数有5个参数
# t是turtle对象,n是线段的条数,direction控制画线段的方向
# length是线段的长度,angle控制旋转的角度
def polyline(t, n, direction, length, angle):
for i in range(n):
t.fd(length)
if direction == 'right':
t.rt(angle)
elif direction == 'left':
t.lt(angle)
# 画弧线的函数,这个函数有4个参数
# t是turtle对象,r是圆的半径,direction是弧线的方向
# angle是弧线的度数
def arc(t, r, direction, angle):
# 通过弧线的度数来计算弧线的长度
arc_length = 2 * math.pi * r * angle / 360
# 每条短线段的长度设定为3,这样肉眼看上去就是连续的
# 计算近似多边形的边数
n = int(arc_length / 3) + 4
# 计算精确的步长
step_length = arc_length / n
# 计算每次的转角
step_angle = float(angle) / n
# 调用polyline函数来画出弧线
polyline(t, n, direction, step_length, step_angle)
# 控制箭头移动的函数,这个函数有三个参数
# t是turtle对象,direction控制移动方向
# distance控制移动距离
def move(t, direction, distance):
# 提笔,再移动不会在画布上留下痕迹
t.pu()
# 判断移动方向,fd向前,bk向后,移动相应距离
if direction == "fd":
t.fd(distance)
elif direction == "bk":
t.bk(distance)
# 放下笔,再移动会在画布上留下痕迹
t.pd()
# 画每条彩带的函数,这个函数有三个参数
# t是turtle对象,r是彩带弧的半径,i是第几条彩带
def single(t, r, i):
# 设定箭头朝向正北
t.setheading(90)
# 画第一条弧线,每次半径减少20,
# 由于是用步长为3的多边形来近似弧线,每次画完都会有些许偏差
# 所有这里对半径和弧度做了一些补偿
arc(t, r - 20 * i + 2, "right", 180 + 0.08 * i)
# 设定箭头朝向正西
t.setheading(180)
# 画一条长度为20的直线
t.fd(20)
# 设定箭头朝向正北
t.setheading(90)
# 画第二条弧线,每次半径减少20,这里对弧度也有补偿
arc(t, r - 20 * (i + 1), "left", 180 + 1.2 + 0.08 * i)
# 设定箭头朝向正西
t.setheading(180)
# 画一条长度为20的直线
t.fd(20)
# 画彩虹的函数,这个函数有四个参数
# t是turtle对象,r是弧的半径,bandwidth是彩虹的宽度,n是几条彩带
def rainbow(t, r, bandwidth, n):
# 彩带的颜色,这里列了7种颜色
colors = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple']
# 循环n次,画出n条彩带
for i in range(n):
t.begin_fill()
# 因为这里只提供了7种颜色,如果彩带条数多于7条
# 会除7取余
t.fillcolor(colors[i % 7])
single(t, r, i)
t.end_fill()
move(t, 'bk', bandwidth - 2)
bob = turtle.Turtle()
move(bob, 'bk', 300)
rainbow(bob, 280, 20, 7)
turtle.mainloop()
结合视频来看,可以对整个过程更加清楚
联系客服