谁说后端不能画出美丽的动图?让我来给大家拜个年!

news2024/11/15 15:29:05

今天我们要介绍的是Python的内置库——小海龟(turtle),它是一个非常实用的绘画工具,不仅可以帮助我们绘制图形,还能让我们查看整个绘画过程。即使对绘画一窍不通的人也能够使用它来创作出生动、形象的gif动图。现在正是龙年即将到来,距离过年也只有几天的时间了。因此,我今天的主要目的就是使用小海龟这个工具,画一副我心目中的拜年gif,提前向大家拜个早年!

turtle

我也可以简单地介绍一下turtle这个工具库。简而言之,turtle允许我们通过控制一个小海龟来绘制图形。这只海龟的起点坐标为(0,0),根据我们的指令,它可以按照我们给出的方向进行移动,并在移动过程中留下轨迹。最后,海龟会将轨迹显示出来,从而形成我们想要的图形。坐标的显示方式是按照严格的四象限来划分的。

image

当然,你有能力通过调整小海龟的速度来控制绘画的速度。默认情况下,小海龟的速度设置为最快的0,最慢的是1。你可以通过增加速度设置的数值来加快绘画的速度,数值越接近10,绘画速度就会越快。当速度设置超过10时,小海龟将会以0的速度进行绘画。

另外,值得一提的是,使用这个小海龟工具时,你可以随时将它重置到初始位置。此外,你还可以自由控制小海龟是否与绘图区域接触。换句话说,如果你不希望小海龟留下路径,可以将它抬起,就像我们使用中性笔时抬起笔尖一样。除此之外,其他方面没有什么特别需要强调的了。

确实,使用这个小海龟工具进行绘图确实需要花费一些精力。你需要逐步修改坐标、选择颜色、改变方向等等。这整个过程的难度甚至比前端开发还要高。。

首先,我认为每逢过年,福字是必不可少的元素。因此,在我的绘图中,福字是一个至关重要的元素,所以我首先会画一个福字,然后再进行其他绘图内容。

相关api

turtle.bgcolor:设置背景颜色。主要是先练习,你自己选择一个好看的颜色就行。

turtle.color:同时设置画笔和填充颜色

turtle.speed:控制小海龟的速度

turtle.penup:抬笔的动作,这样的话,你再怎么动小海龟也不会有轨迹出现

turtle.pendown:放笔的动作,再动就要出现轨迹了

turtle.home:直接回到原点

turtle.forward:让小海龟换方向

turtle.write:简单的开始写字,当然了,如果你不用这个api的话,按照你的提示轨迹,可以一笔一划的写出来一个字,这个api不会一笔一划,就是简单的把你想要的字放上去而已。

done:全部完成。不写这个api的话,做完图后,整个窗口会自动关闭。

让我们先来欣赏一下我所创作的效果图吧。

image

我很乐意与大家分享我所创作的效果图,并附上源码,供大家参考和学习。请看下方源码:

import turtle              # 导入turtle库(模块)
turtle.bgcolor("#ffffff")  # 设置背景颜色为
turtle.speed(7)
# turtle.speed(10)        # 可减慢画正方形和写字的速度

### ②画灰色阴影
turtle.color("#404040")   # 同时设置画笔和填充颜色都为#404040,一种深灰色。
a=100                     # 正方形内等腰直角三角形的直角边为a
b=2**0.5*a                # 斜边为b ,等腰直角三角形的斜边=√2倍的直角边

turtle.penup()
turtle.goto(-210,180)             # 步骤1光束画完后,让海龟返回原点,即海龟移动至坐标(0,0),并设置朝向为初始方向(向右)。
turtle.forward(a)
turtle.pendown()

turtle.begin_fill()
turtle.left(135)
turtle.forward(b)
turtle.left(90)
turtle.forward(b)
turtle.left(90)
turtle.forward(b)
turtle.left(90)
turtle.forward(b)
turtle.end_fill()

### ③ 画正方形红纸
turtle.color("#ea182a")   # 同时设置画笔和填充颜色都为#ea182a,一种红色。
a=100
b=2**0.5*a

turtle.penup()
turtle.home()     # 第2步灰色阴影画完后,让海龟返回原点,即海龟移动至坐标(0,0),并设置朝向为初始方向(向右)。
turtle.goto(-205,180)
turtle.forward(a)
turtle.pendown()

turtle.begin_fill()
turtle.left(135)
turtle.forward(b)
turtle.left(90)
turtle.forward(b)
turtle.left(90)
turtle.forward(b)
turtle.left(90)
turtle.forward(b)
turtle.end_fill()

### ④ 写文字“福”
turtle.color("black")
turtle.penup()
turtle.goto(-210,175)            # 让海龟返回原点
turtle.setheading(-90)   # 让海龟头部朝下
turtle.forward(50)      # 让海龟向下移动150个像素。这个数字需要不断调试。
turtle.pendown()
turtle.write("福", align="center",font=("黑体",90,"bold"))

### 海龟绘图结束,隐藏海龟
turtle.hideturtle()
turtle.done()

赋诗一首

在这个喜庆的新年时刻,作为作者我承认自己的语文水平有限,并不擅长写春联。不过,我想简单地为大家奉上一首诗作《元日》,以表达我的祝福。希望大家喜欢,祝愿大家新年快乐!

涉及api

turtle.pensize:就是我们要使用多大号的笔。越大线条越粗。

turtle.shape:显示一下小海龟的形状

turtle.hideturtle:隐藏小海龟的形状,因为作画的时候 ,默认时显示小海龟的,如果你不想看见他直接隐藏即可。

首先,让我们一起观看一下我所准备的效果图吧。在此我想强调一点,效果图中的小箭头是由于生成gif时产生的,实际效果并没有这些箭头存在。

image

同样源码附上,给大家一个参考:

# 海龟写古诗《元日》
### 程序初始化设置
import turtle
turtle.bgcolor("#b1352b")     # 设置背景颜色为#b1352b,一种红色。ffffff为白色
turtle.speed(0)               # 设置海龟绘图的速度,参数为0时最快
turtle.pensize(1)             # 设置画笔粗细,即竖线的粗线为1
turtle.pencolor("#f2ea99")    # 设置画笔颜色,即竖线和书法的颜色为#f2ea99,一种黄色。000000为黑色

fontname="黑体"                # 字体名称
fontsize=35                   # 字体大小
column1="爆竹声中一岁除"        # column是列的英文单词
column2="春风送暖入屠苏"
column3="千门万户曈曈日"
column4="总把新桃换旧符"
column5="宋王安石元日"
column6="努力的小雨书"
colwidth=100                  # 设置列宽colwidth

### ① 画竖线
x=245                         # 确定第一条竖线顶端的横坐标
y=230                         # 确定第一条竖线顶端的纵坐标
for i in range(6):            # 循环6次,画6根竖线
    turtle.penup()            # 海龟抬笔,没有移动(绘画)痕迹
    turtle.goto(x,y)          # 海龟移动至坐标(x,y)
    turtle.pendown()          # 海龟落笔,移动(绘画)有痕迹
    turtle.setheading(-90)    # 让海龟的头部朝下
    turtle.forward(460)       # 让海龟前进460个像素,即竖线的长度是460像素
    x=x-colwidth              # 将横坐标重新赋值为原横坐标减去列宽colwidth

### ② 海龟写诗《元日》
turtle.speed(5)               # 重新设置海龟写字的速度
# 写第1列
x=200                         # 设置第1列文字第1个字的横坐标
y=160                         # 设置第1列文字第1个字的纵坐标
for i in range(7):            # 第1列共显示7个字,所以循环7次
    turtle.penup()            # 海龟抬笔,没有移动(绘画)痕迹
    turtle.goto(x,y)          # 海龟移动至坐标(x,y)
    turtle.pendown()          # 海龟落笔,移动(绘画)有痕迹
    turtle.write(column1[i], align="center",font=(fontname,fontsize,"normal"))
    y=y-60                    # 每个字间隔60个像素

# 写第2列
x=x-colwidth
y=160
for i in range(7):             # 第2列共显示7个字,所以循环7次
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.write(column2[i], align="center",font=(fontname,fontsize))  #第3个参数省略时默认为"normal"
    y=y-60

# 写第3列
x=x-colwidth
y=160
for i in range(7):
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.write(column3[i], align="center",font=(fontname,fontsize))
    y=y-60

# 写第4列
x=x-colwidth
y=160
for i in range(7):
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.write(column4[i], align="center",font=(fontname,fontsize))
    y=y-60

### ③ 写落款
# 写第5列
x=x-80                       # 设置第5列第一个字的横坐标位置
y=100                        # 设置第5列第一个字的纵坐标位置
for i in range(6):           # 第5列共显示6个字,所以循环6次
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.write(column5[i], align="center",font=(fontname,20,))
    y=y-30                   # 落款每个字的间隔是30。字小间隔也要小

# 写第6列
x=x-40
y=100
for i in range(6):           # 第6列共显示9个字,所以循环9次
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.write(column6[i], align="center",font=(fontname,20))
    y=y-30

turtle.penup()
turtle.forward(10)
turtle.pendown()
turtle.setheading(0)         # 让海龟的头部朝右
turtle.color("#e1f4d6")      # 设置海龟显示的颜色
turtle.shape("classic")       # 设置海龟显示的形状

# 海龟写完水印文字后,返回原点
turtle.penup()    
turtle.home()              
turtle.pendown()
turtle.done()

烟花

在过年期间,若是不放烟花,咋都说不过去。然而,单独谈论烟花确实很难创作,因为它是一种行动,与福字和诗歌不同。烟花必须要有动势,也不能忽略烟花自身需要逐渐消失的特点。这其中存在着许多难题,因为一旦消失了,我之前写的诗句和文字都会消失,就白费功夫了。

一顿搜索下才查找到了回滚这么一个动作。但是回滚这个动作不能让人看见啊,一个烟花放完了总不能自己还能再缩回去啊,所以又继续查,发现了类似于快进这样一个功能,让你看不见中间的流程直接输出结果。

终于,我期盼已久的烟火终于来临。然而,我不愿让它自行燃放,我想亲自参与其中,为大家拜个早年。因此,我决定将烟花的燃放变得更有趣,设计成只有在点击鼠标后才能绽放。

设计api

turtle.tracer:是否显示轨迹

turtle.getscreen():获取整个屏幕,因为我们要鼠标的点击事件。

turtle.undo():这个就是做回滚操作的,但是如果你不想看见动作,你需要和下一个api连用。

turtle.tracer:这个方法里面有一个delay,可以在几毫秒中跳过多少个步骤。这个需要你计算。

src.onclick(follow):发送点击事件,注意这个follow函数自动传入两个参数也就是x,y两个坐标值。

让我们先来欣赏一下效果图吧。尽管它的外观可能不是非常出色,但总体而言,我对它还是比较满意的。

image

同样的源码附上,给大家一个参考:

import turtle
import time
import random
from turtle import *

colors = ['red', 'blue', 'yellow', 'white',
            'green', 'orange', 'purple', 'seagreen',
            'indigo', 'cornflowerblue']

turtle.tracer(False)
turtle.ht()
src = turtle.getscreen() 

def draw_firework(count, dis, ang):
    for c in range(count):
        forward(dis)
        left(ang)        
        
def follow(startx,starty):
    need_list = [] 
    ccol = random.choice(colors)
    dist = random.randint(50, 80)
    if dist <= 60:
        angle = 171
    else:
        angle = random.choice([174, 175, 176])
    add = (dist - 30) / 10
    count = int(360 / (180 - angle))
    need_list.append([startx, starty, ccol, dist, angle, add, count])
    draw(need_list)

def draw(lis):
    pensize(2)
    for t in range(5):
        for li in lis:
            x, y, col, dis, ang, add, count = li
            penup(), goto(x - t * add / 2, y), pendown()
            color('#b1352b', col)
            begin_fill()
            setheading(0)
            draw_firework(count, t * add + 30, ang)
            end_fill()
        update()
        time.sleep(0.015)
        print('tracer-',tracer())
        print('count-',count)
        turtle.tracer(count*2+8,1)
        for i in range(count*2+8):
            undo()
    turtle.ht() 
    pensize(5)
    for t in range(10):
        for li in lis:
            x, y, col, dis, ang, add, count = li
            count = int(count / 4)
            penup(), goto(x - add * 5 + 10, y), pendown()
            setheading(-90)
            stara = dis / 2 - 10
            penup(), left(90), backward(2 * t), right(90)
            for i in range(count):
                penup()
                pencolor(col)
                circle(stara + t * 2, 360 / count - 1)
                pendown()
                circle(stara + t * 2, 1)
        update()
        time.sleep(0.03)
        # clear()
        turtle.tracer(count*4,1)
        for i in range(count*4):
            undo()

turtle.ht()
src.onclick(follow)
turtle.done()

龙年快乐

所有的元素都已经完成,剩下的只需拼装在一起。我觉得这里的背景显得过于单一,所以我决定直接使用一张图作为背景。当然,如果你有时间,完全可以自己单独制作一张背景图。不多说了,祝福大家龙年快乐!愿你们的生活像龙一样充满力量和勇气,愿你们在新的一年里,追逐梦想,勇往直前,不断超越自我。愿你们的家庭幸福美满,团圆和谐。愿你们的事业蒸蒸日上,财源广进。愿你们的身体健康强壮,心灵充实。让我们一起庆祝龙年,共同创造美好的未来!

image

文章转载自:努力的小雨

原文链接:https://www.cnblogs.com/guoxiaoyu/p/17991503

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC项目——Meta:根据对话音频生成带动作和手势的3d逼真数字人

From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations From Audio to Photoreal Embodiment:Synthesizing Humans in Conversations 从二元对话的音频中&#xff0c;我们生成相应的逼真的面部、身体和手势。 概括性:角色是由作者的声音驱动的(而不是模…

【获奖必看2.0】美赛小技巧之一秒输入一个公式

大家好呀&#xff0c;美赛开赛还有四天的时间&#xff0c;今天给大家带来的是美赛论文写作时非常实用的一个小技巧——快速输入任何复杂公式。 相信很多小伙伴在论文写作的时候都有一个小烦恼&#xff0c;那就是在面对比较复杂的公式的时候&#xff0c;应该怎么进行快速输入呢…

12.2 关键点提取——SIFT

一、理论 文章看了以下博文&#xff1a;Sift中尺度空间、高斯金字塔、差分金字塔&#xff08;DOG金字塔&#xff09;、图像金字塔-CSDN博客 该文章对SIFT写的很详细&#xff0c;所以在这里我直接抄过来作为笔记。如果以后作者变为付费文章可以提醒我删除。 1.图像金字塔 图像…

酒店|酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 &#xff08;1&#xff09;系统首页 &#xff0…

Spring Boot + security + jwt 测试安全策略

一、测试概述 主要目的是测试security的用法。因测试搭建mysql和redis比较麻烦&#xff0c;所以我这里将自定义的jwt和用户信息缓存到程序的内存中。 本人测试的项目比较混乱&#xff0c;Spring Boot父类只标出有用的依赖。其子类用的版本为jdk11。后续会继续深入oauth2&#x…

微服务-微服务Alibaba-Nacos注册中心实现

1. 系统架构的演变 俗话说&#xff0c; 没有最好的架构&#xff0c;只有最合适的架构。 微服务架构也是随着信息产业的发展而出现的最有普 遍适用性的一套架构模式。通常来说&#xff0c;我们认为架构发展历史经历了这样一个过程&#xff1a;单体架构——> 垂直架构 ——&g…

Java后端须知的前端知识

Java后端须知的前端知识 HTML &#xff08;超文本标记语言&#xff09; W3C标准 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript 快速入门 <html><head><title></title></head><body><font color"red&q…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…

vue3.0 + 动态加载组件 + 全局注册组件

首先 vue 动态加载组件使用的是 component 标签&#xff0c;并通过设置组件的is 属性来指定要渲染的组件。例如&#xff1a; <component :is"currentComponent"></component>其中&#xff0c;currentComponent 是一个变量&#xff0c;它的值可以是以下几…

BP图片降噪MATLAB代码

BP(Back Propagation)神经网络是一种常用的深度学习模型,可以用于图像降噪。主要步骤包括: 构建BP神经网络模型。包括输入层、隐藏层和输出层。输入层大小与图像大小相同,输出层大小也与输入图像大小相同。隐藏层根据图像复杂度设定。 准备训练数据。使用干净图像作为输入,加…

数字图像处理(实践篇)三十八 OpenCV-Python实现ORB特征检测实践

​ 目录 一 涉及的函数 二 实践 ​ ORB(Oriented FAST and Rotated BRIEF)是一种特征点检测和描述算法,它结合了FAST关键点检测和BRIEF描述子。ORB算法具有以下优势: ①实时性:能够在实时应用中进行快速的特征点检测和描述。

基于Vue uniapp和java SpringBoot的汽车充电桩微信小程序

摘要&#xff1a; 随着新能源汽车市场的迅猛发展&#xff0c;汽车充电桩的需求日益增长。为了满足市场需求&#xff0c;本课题开发了一款基于Java SpringBoot后端框架和Vue uniapp前端框架的汽车充电桩微信小程序。该小程序旨在为用户提供一个简洁高效的充电服务平台&#xff0…

【pytest系列】- assert断言的使用

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

海外云手机运营Instagram攻略

Instagram是世界著名的社交媒体平台&#xff0c;有着10亿实时用户&#xff0c;是跨境电子商务的优质流量来源。平台以女性用户为主&#xff0c;购物倾向高&#xff0c;转化率好。它被公认为外贸行业的优质社交媒体流量池。那么&#xff0c;如何使用海外云手机吸引Instagram上的…

Spring cloud智慧工地信息平台管理系统源码

目录 报警统计 实时报警列表 工程进度 劳务信息 隐患信息 施工安全管理 人员证书管理 专项安全方案 安全方案审批 隐患排查管理 安全检查统计 危险源Top10 整改超时预警 检查问题数量统计 安全隐患趋势 安全日志管理 视频监控查看 视频回放 AI危险源识别 AI应用总览 AI设备 机械…

【Servlet】Smart Tomcat插件简化Servlet开发流程及解决常见问题

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、Smart Tomcat插件二…

Kotlin快速入门系列2

Kotlin的基本数据类型 Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是&#xff0c;字符不属于数值类型&#xff0c;是一个独立的数据类型。 Java和kotlin数据类型对照如下&#xff1a; Java基本数据类型 Kotlin对象数据类型 数据类…

深度强化学习(王树森)笔记08

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

Hadoop3.x学习笔记

文章目录 一、Hadoop入门1、Hadoop概述1.1 简介1.2 hadoop优势1.3 hadoop组成1.4 大数据技术生态体系 2、环境准备(重点)2.1 模板机配置2.2 模板创建 3、本地运行模式&#xff08;官方WordCount&#xff09;4、Hadoop集群搭建(&#x1f31f;重点)4.1 环境准备(集群分发脚本xsyn…

java框架面试篇

Spring框架 spring Bean线程安全问题 Scope注解 我们可以在bean的类上加Scope注解来声明这个Bean是单个实例还是多个实例。在默认情况下Bean是单个实例的&#xff0c;此时的注解中的属性默认为Scope("singleton")&#xff0c;Scope("prototype")则是一…