来 左边 跟我一起画彩虹

时间:2022-07-22
本文章向大家介绍来 左边 跟我一起画彩虹,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

最近被《野狼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()