当前位置: 首页 > news >正文

Python漂浮的爱心

漂浮的爱心

系列文章

序号直达链接
Tkinter
1Python李峋同款可写字版跳动的爱心
2Python跳动的双爱心
3Python蓝色跳动的爱心
4Python动漫烟花
5Python粒子烟花
Turtle
1Python满屏飘字
2Python蓝色流星雨
3Python金色流星雨
4Python漂浮爱心
5Python爱心光波①
6Python爱心光波②
7Python满天繁星
8Python五彩气球
9Python白色飘雪
10Python七彩花朵
11Python 3D星空
12Python大雪纷飞
13Python一闪一闪亮星星
14Python爱心泡泡
15Python爱心射线
16Python圣诞礼物
17Python礼物圣诞树
18Python浪漫星空
19Python飞舞蝙蝠
20Python万圣礼物
21Python蓝色飘雪
Pygame
1Python跨年烟花
2Python炫酷烟花
3Python黑客帝国字母雨
敬请期待……

写在前面

Python实现漂浮爱心动画的完整代码。

技术需求

  1. Turtle 图形库

    • 通过 turtle 库进行图形绘制,创建了动态的爱心动画。使用 Pen() 创建画笔对象,控制画笔的运动、绘制和颜色等属性。turtle 库还提供了绘制基本几何图形(如圆形、直线等)的功能,适用于动画和图形界面的创建。
  2. 面向对象编程 (OOP)

    • 通过定义 Heart 类来实现爱心的对象化管理。每个爱心具有自己的属性(如位置、速度、颜色、半径等)和方法(如移动、绘制等)。这种设计方式使得每个爱心的行为独立且封装,方便管理和扩展。
  3. 随机数生成

    • 使用 random 库生成随机数,为每个爱心的属性(如位置、大小、颜色、速度)赋予随机值,使得每次运行时爱心的位置、运动轨迹和速度都不相同,从而增加了动画的随机性和趣味性。
  4. 数学计算

    • 使用 math 库中的三角函数 sin() 来控制爱心左右的摆动。通过正弦函数的变化,爱心的水平运动轨迹呈现波动效果,模拟了自然的漂浮感觉。
  5. 动态画布更新

    • 使用 tu.tracer(0)tu.update() 来优化画布的更新。tu.tracer(0) 禁用自动刷新,避免每次绘制时屏幕的闪烁;tu.update() 在所有绘制完成后一次性刷新屏幕,提高了动画的流畅度。
  6. 无限循环与实时动画

    • 通过 while True 无限循环实现了爱心的持续漂浮和动态更新,模拟了连续的动画效果。每次循环都会更新爱心的位置,并重绘它们。

完整代码

import turtle as tu
import random as ra
import mathtu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
t = tu.Pen()
t.ht()
colors = ['pink']
class Heart():    #每个爱心(爱心类)def __init__(self):self.r = ra.randint(10,15)        #爱心的半径self.x = ra.randint(-1000,1000)   #爱心的横坐标self.y = ra.randint(-500,500)     #爱心的纵坐标self.f = ra.uniform(-3.14,3.14)   #爱心左右移动呈正弦函数self.speed = ra.randint(5,10)     #爱心移动速度self.color = ra.choice(colors)    #爱心的颜色self.outline = 1                  #爱心的外框大小(可不要)
……

代码分析

这段 Python 代码使用 turtle 库和 random 库创建了一种动态效果,其中多个爱心在屏幕上飘浮,模拟爱心随时间和运动的变化。下面将从代码的各个部分进行详细分析,重点关注代码的功能、实现过程、以及相关的技术细节。

1. 引入必要的库

import turtle as tu
import random as ra
import math

这段代码导入了三个库:

  • turtle:Python 的一个图形绘制模块,常用于绘制简单的图形和动画。
  • random:用于生成随机数的库,代码中用它来随机生成爱心的属性(位置、速度等)。
  • math:提供数学运算支持,在这里用来处理一些运动的三角函数,特别是爱心的左右摆动。

2. 设置屏幕参数

tu.setup(1.0, 1.0)
tu.screensize(1.0, 1.0)
  • tu.setup(1.0, 1.0) 设置了屏幕的宽度和高度为 1.0,即使用屏幕的最大范围。
  • tu.screensize(1.0, 1.0) 设置了屏幕的显示区域,参数也为最大。

3. 创建画笔对象

t = tu.Pen()
t.ht()
  • t = tu.Pen() 创建了一个画笔对象 t,可以用它来控制 Turtle 画笔的状态和位置。
  • t.ht() 隐藏了画笔。因为我们不需要在屏幕上看到画笔本身,只需绘制出爱心图形。

4. 定义颜色列表

colors = ['pink']

这里的颜色列表只包含一个颜色 'pink',表示所有爱心的颜色都将是粉色。这也使得整个动画具有统一的风格。

5. 定义 Heart 类

  • Heart 类用于表示一个爱心对象,每个实例代表一个漂浮的爱心。
  • self.r:随机生成爱心的半径,取值范围是 10 到 15。
  • self.xself.y:随机生成爱心的初始位置,x 在横轴上取值范围为 -1000 到 1000,y 在纵轴上取值范围为 -500 到 500。
  • self.f:随机生成一个角度值,用于控制爱心的左右移动,范围是 -π 到 π。
  • self.speed:随机生成爱心的速度,取值范围为 5 到 10。
  • self.color:爱心的颜色,这里是从 colors 列表中随机选取颜色,虽然目前 colors 列表只有 'pink' 一个颜色,但可以方便未来扩展。
  • self.outline:爱心的外框线宽,默认值为 1。

6. move 方法

  • 该方法控制爱心的位置更新和漂浮。
  • 首先判断爱心是否在画布范围内 (self.y <= 500)。
    • 如果爱心仍在画布内,self.y += self.speed 使爱心垂直方向上向下移动,self.x += self.speed * math.sin(self.f) 控制爱心在水平方向上的移动,self.f += 0.1 使得爱心的左右运动呈现正弦波状。
    • 如果爱心超出了画布的下边界 (self.y > 500),则重新生成一个新的爱心对象,并将其初始位置设置为画布的上方。

7. draw 方法

  • draw 方法负责使用 turtle 绘制爱心形状。
    • t.pensize(self.outline) 设置画笔的外框宽度。
    • t.penup() 抬起画笔,移动到指定位置后再绘制。
    • t.goto(self.x, self.y) 将画笔移动到当前爱心的随机位置。
    • t.pendown() 放下画笔开始绘制。
    • 使用 begin_fill()end_fill() 方法填充爱心内部颜色为粉色。
    • 通过 t.setheading(120) 设置画笔的初始角度,t.circle(self.r, 195) 画出爱心的两个半圆部分,t.fd(self.r * 2.4)t.left(90) 绘制爱心的底部。

8. 创建多个爱心对象

Hearts = []            # 用列表保存所有爱心
for i in range(100):Hearts.append(Heart())
  • Hearts 列表用于保存所有的爱心对象。通过 for 循环,创建 100 个 Heart 实例,并将其添加到 Hearts 列表中。

9. 设置背景颜色

tu.bgcolor('black')
  • 这行代码将画布的背景色设置为黑色,能让粉色的爱心更加突出。

10. 漂浮效果的实现

  • 进入一个无限循环,模拟爱心漂浮的过程。
  • tu.tracer(0) 禁用画布的自动刷新,以提高性能,避免每次绘制都更新屏幕。
  • t.clear() 清除当前的绘图,准备进行下一次绘制。
  • 使用 for i in range(50) 来控制当前绘制 50 个爱心对象。
    • Hearts[i].move() 调用每个爱心的 move 方法,使爱心根据随机属性移动。
    • Hearts[i].draw() 绘制爱心。
  • tu.update() 刷新画布,显示更新后的图形。

11. 总结

这段代码通过定义 Heart 类,结合随机生成的属性和移动机制,使用 turtle 库绘制了一个动态的爱心飘浮效果。每个爱心都有随机的颜色、速度、位置和运动轨迹,模拟了爱心在画布上自由飘浮的效果。这种设计方法不仅实现了动态效果,还通过面向对象的设计,使得代码结构清晰易于扩展。

写在后面

我是一只有趣的兔子,感谢你的喜欢!

相关文章:

  • 闲庭信步使用SV搭建图像测试平台:第五课——使用task
  • 【Fargo】mediasoup发送2:码率分配、传输基类设计及WebRtcTransport原理
  • x1+x2=4 X1-X2=2的画图呢?
  • std::shared_ptr 的线程安全性
  • Java基础 6.21
  • cursor中定义cursor rules
  • 【Elasticsearch】运维监控:分片和节点
  • 当数据自己会说话:聚类与分类算法全景解析
  • P1220 关路灯
  • AI大模型学习之基础数学:微积分-AI大模型的数学引擎
  • nn4dms开源程序是用于深度突变扫描数据的神经网络
  • 安装 Labelme
  • 如何使用Ant Design Blazor组件在列表页弹窗增加修改数据
  • C++ 文件读写
  • 并查集(Disjoint-Set Union)详解
  • 单点登录(SSO)系统
  • SpringAI1.0.0 入门案例
  • 教育培训APP源码核心功能开发详解:直播、考试、组卷系统全拆解
  • GNU Octave 基础教程(8):GNU Octave 常用数学函数
  • nginx服务器配置时遇到的一些问题
  • 营销型网站建设企业/淘数据
  • 忻州建站公司/营销技巧有哪些
  • 宣传片拍摄清单/seo从入门到精通
  • 进网站备案时间/十大外贸平台
  • 域名哪里注册/seo优化一般多少钱
  • 客服做的比较好的网站/seo方法