美国队长的盾(一) 同心圆

时间:2022-07-22
本文章向大家介绍美国队长的盾(一) 同心圆,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

《复仇者联盟》俗称“妇联”,相信大家都看过。其中每位英雄都有自己独特的兵器或者技能。雷神的锤子,钢铁侠的盔甲,黑豹的振金战衣,鹰眼的弓箭,还有美国队长的盾。

美国队长的这块由振金和其他化学品组成的超级盾牌,几乎坚不可摧。其外表光滑,具有完美的空气动力学特征,能够保证投掷路线不会偏移。在经过长期训练的美队手中更是一个完美的投掷物,可以做到人盾合一的地步。

攻击等级:★★★☆

防御等级:★★★★

今天我们就来用python来打造这样一款神器。其实这块盾牌从几何学的角度来看,还是很规整的。四个同心圆,加一个五角星。跟它强大战斗力比起来简直弱爆了!

如果看过我们往期内容的小伙伴,画圆应该不是什么难事了。

Python之turtle模块-画圈圈

除了形状,这块盾主要包含三种颜色,红色,白色和蓝色。前面我们也讲过了,在python里面只有封闭的形状才能够填充颜色。那初步的想法就是由外而内画四个同心圆,然后填上不同的颜色。

说干就干,

import turtle
import math


# 定义一个画多线段的函数,这个函数有五个参数
# t是turtle对象,n是线段数,length为每条线段的长度
# angle每次旋转的角度,direction旋转的方向
def polyline(t, n, length, angle, direction):
    # 循环n次画出n条线段
    for i in range(n):
        # 画边
        t.fd(length)
        # 判断旋转的方向
        if direction == "left":
            t.lt(angle)
        elif direction == "right":
            t.rt(angle)


# 画弧线的函数,t是turtle对象,r是弧的半径
# angle是每次旋转的角度,direction是弧旋转的方向
def arc(t, r, angle, direction):
    # 根据半径计算圆的周长
    circumference = 2 * math.pi * r
    # 根据弧度计算弧长
    arc_len = angle / 360 * circumference
    # 这里设定线段长度为3,计算线段数,int强制转换成整数
    n = int(arc_len / 3) + 1
    # 得到整数的线段数之后,重新计算线段的长度,
    # 得到的length这时可能是小数了
    length = arc_len / n
    # 计算每一次旋转的角度
    step_angle = angle / n
    # 调用前面定义的画多线段的函数来画弧线
    polyline(t, n, length, step_angle, direction)


# 移动的函数,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()


# 让箭头回到原点
def home(t):
    t.pu()
    t.home()
    t.pd()


# 定义一个画圆的函数,这个函数有三个参数
# t是turtle对象,r圆的半径,color圆的填充色
def circle(t, r, color):
    # 回到原点
    home(t)
    # 移动一个半径的距离
    move(t, 'fd', r)
    # 调整箭头正北
    t.setheading(90)
    # 设置填充色
    t.begin_fill()
    t.fillcolor(color)
    # 画圆
    arc(t, r, 360, 'left')
    # 填充结束
    t.end_fill()

# 定义一个画盾牌的函数
# t是turtle对象,r是最大圆的半斤
def shield(t, r):
    # 计算一个合适的步长
    step = r / 150 * 30
    # 画第一个圆
    circle(bob, r, 'red')
    # 画第二个圆
    circle(bob, r - step, 'white')
    # 画第三个圆
    circle(bob, r - 2 * step, 'red')
    # 画第四个圆
    circle(bob, r - 3 * step, 'blue')



bob = turtle.Turtle()
shield(bob, 100)
bob.hideturtle()
turtle.mainloop()

来看看半成品