当前位置: 首页 > 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. Tkinter图形界面库

  • Tkinter:用于创建图形用户界面(GUI)。通过Tkinter库,代码能够创建全屏窗口、绘制画布并控制动画的显示。它是Python中用于GUI开发的标准库之一,支持创建按钮、文本框、画布等图形界面元素。

2. 数学计算与函数

  • 数学公式:通过数学公式生成心形曲线坐标。利用了三角函数(sincos)和常量pi来实现心形的形状。这部分涉及基本的数学建模,用于确定心形图案。
  • 对数和指数函数:用来生成散点、扩散点和随机光晕的效果。例如,log(random.random())用于生成随机散点,模拟心形的扩散效果。

3. 随机数生成与噪声

  • 随机数生成random库用于生成随机数,帮助创建不规则的散点、光晕扩散等效果,使得心形的动画看起来更加自然和动态。
  • 噪声模拟:通过调整点的位置(例如scatter_pointsshrink_points函数中的随机偏移),模拟自然现象中的随机噪声。

4. 动画与帧更新

  • 帧更新:通过main.after方法实现动画的逐帧更新。每一帧都会删除上一帧的图形并绘制新的图形,实现动画效果。
  • 时间延迟:使用FRAME_DELAY来控制每一帧的播放速度,从而影响动画的流畅度。

5. 坐标系和几何变换

  • 坐标系变换:通过对心形坐标的缩放、旋转等操作,结合shrink_points等函数,实现心形图案的动态变换(例如,缩小、偏移等)。
  • 几何变换:代码中涉及了坐标的平移、缩放和旋转,使得动画中的心形能够动态变化,增加视觉效果。

6. 面向对象编程

  • 类与对象:使用面向对象编程(OOP)的方式设计了HeartHeartParameters两个类,分别管理心形参数和动画中的点集。通过这种方式,代码结构更加清晰,易于扩展和维护。
  • 封装与方法:类内部的方法负责管理和更新数据(如点的生成和位置更新),提高了代码的可读性和复用性。

7. 图形绘制与颜色控制

  • Canvas绘制:使用Canvas组件进行图形绘制。create_rectangle方法用于在画布上绘制心形的点,形成动态的效果。
  • 颜色控制:通过设置INNER_HEART_COLOROUTER_HEART_COLOR,代码能够控制不同类型点的颜色,增强视觉效果。

完整代码

import random
from math import sin, cos, pi, log
from tkinter import *# Constants
IMAGE_ENLARGE = 11
INNER_HEART_COLOR = "pink"
OUTER_HEART_COLOR = ""
SCATTER_BETA = 0.15
SHRINK_RATIO = 15
CURVE_RATIO = 10
FRAME_DELAY = 160
NUM_POINTS = 2000
NUM_HALO_POINTS = 3000
NUM_EDGE_DIFFUSION_POINTS = 3
HALO_RANDOM_FACTOR = 14# Heart Parameters Class
class HeartParameters:def __init__(self):self.points = set()self.edge_diffusion_points = set()self.center_diffusion_points = set()self.all_points = {}# Heart Function
def heart_function(t, shrink_ratio=IMAGE_ENLARGE):x = 16 * (sin(t) ** 3)y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))x, y = x * shrink_ratio + CANVAS_CENTER_X, y * shrink_ratio + CANVAS_CENTER_Yreturn int(x), int(y)# Scatter Points
def scatter_points(x, y, beta=SCATTER_BETA):ratio_x, ratio_y = -beta * log(random.random()), -beta * log(random.random())dx, dy = ratio_x * (x - CANVAS_CENTER_X), ratio_y * (y - CANVAS_CENTER_Y)return x - dx, y - dy……

代码分析

这段代码实现了一个动态心形动画,使用的是Python的Tkinter库来创建图形界面,并结合数学公式生成心形的动画效果。动画通过绘制心形的散点、扩散点、缩小点以及环绕心形的光晕,形成了一个复杂的动态效果。下面我将详细分析这段代码的工作原理、关键部分以及它们如何协同工作。

1. 导入必要的库

import random
from math import sin, cos, pi, log
from tkinter import *
  • random: 用于生成随机数,帮助生成动画中的随机散点和动态效果。
  • math库中的sin, cos, pi, log等函数用于数学计算,主要用于心形曲线的公式以及散点的生成。
  • tkinter: Python的GUI库,用于创建窗口、按钮和绘图画布等。

2. 常量定义

IMAGE_ENLARGE = 11
INNER_HEART_COLOR = "pink"
OUTER_HEART_COLOR = ""
SCATTER_BETA = 0.15
SHRINK_RATIO = 15
CURVE_RATIO = 10
FRAME_DELAY = 160
NUM_POINTS = 2000
NUM_HALO_POINTS = 3000
NUM_EDGE_DIFFUSION_POINTS = 3
HALO_RANDOM_FACTOR = 14

这些常量用于控制动画的各个方面:

  • IMAGE_ENLARGE: 控制心形的大小。
  • INNER_HEART_COLOROUTER_HEART_COLOR: 设置心形的颜色。
  • SCATTER_BETA: 控制散点扩散的程度。
  • SHRINK_RATIO: 控制心形缩小的比例。
  • CURVE_RATIO: 控制心形曲线的变化比例。
  • FRAME_DELAY: 控制每一帧的时间延迟,即动画播放速度。
  • NUM_POINTS: 控制生成的心形点的数量。
  • NUM_HALO_POINTS: 控制环绕心形的光晕点的数量。
  • NUM_EDGE_DIFFUSION_POINTS: 控制边缘扩散点的数量。
  • HALO_RANDOM_FACTOR: 控制光晕点的随机偏移程度。

3. HeartParameters

class HeartParameters:def __init__(self):self.points = set()self.edge_diffusion_points = set()self.center_diffusion_points = set()self.all_points = {}

HeartParameters类负责存储与心形相关的各类点:

  • points: 存储心形的主要点。
  • edge_diffusion_points: 存储边缘扩散的点。
  • center_diffusion_points: 存储中心扩散的点。
  • all_points: 存储所有帧的所有点信息,以便在每一帧更新时渲染。

4. heart_function函数

def heart_function(t, shrink_ratio=IMAGE_ENLARGE):x = 16 * (sin(t) ** 3)y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))x, y = x * shrink_ratio + CANVAS_CENTER_X, y * shrink_ratio + CANVAS_CENTER_Yreturn int(x), int(y)

该函数定义了心形的数学方程:

  • 通过sinecosine函数的组合,生成心形曲线的(x, y)坐标。
  • shrink_ratio用于缩放心形的大小,CANVAS_CENTER_XCANVAS_CENTER_Y用于将心形的坐标移至画布中心。

5. scatter_pointsshrink_points函数

  • scatter_points: 通过对x和y的坐标进行随机偏移,实现散点效果,模拟光晕或扩散的效果。
  • shrink_points: 根据心形点与画布中心的距离,按一定比例缩小点的位置,模拟心形的动态变化。

6. curve函数

def curve(p):return 2 * (3 * sin(4 * p)) / (2 * pi)

该函数生成一个曲线变化值,控制动画中某些点的偏移和变化,基于参数p(通常与帧数有关)。这个曲线的变化为动画的动态效果提供了更多的变化性。

7. Heart

Heart类是动画的核心,它负责生成和管理心形的所有点以及计算每一帧的动态效果。它包含了以下方法:

  • build_points: 根据心形公式生成心形的基本点,并为这些点添加扩散和散点效果。
  • calculate_frames: 计算生成的每一帧。
  • calculate_frame: 计算特定帧的动态效果,例如光晕、散点、中心扩散等。
  • _add_all_points: 将不同类型的点(例如扩散点、中心点等)添加到所有点集合中。

8. 动画渲染

def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame=0):render_canvas.delete('all')render_heart.render(render_canvas, render_frame)main.after(FRAME_DELAY, draw, main, render_canvas, render_heart, render_frame + 1)

draw函数是主循环,它通过main.after函数每隔一定时间更新一次画布,达到动画效果。render方法则渲染每一帧的图形。

9. 窗口和画布的设置

root = Tk()
root.title('Heart Animation')
root.attributes('-fullscreen', True)
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()CANVAS_WIDTH, CANVAS_HEIGHT = screen_width, screen_height
CANVAS_CENTER_X, CANVAS_CENTER_Y = CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2

这段代码设置了Tkinter窗口的基本参数,并获取了屏幕的宽度和高度,确保动画能够填满整个屏幕。

10. 总结

该代码使用了Tkinter来创建一个全屏的窗口,并利用数学公式和随机算法生成一个动态的心形动画。通过不断生成心形的各个点(包括散点、扩散点等),并使用数学公式控制每一帧的变化,最终实现了一个不断变化的动态效果。代码中的Heart类负责管理和计算这些点,而draw函数负责渲染每一帧,形成流畅的动画。

关键的技术点包括:

  • 心形公式的数学实现。
  • 随机算法生成动画中的动态效果(散点、扩散点等)。
  • 通过Tkinter绘制图形和处理帧更新,实现动画效果。

这种基于数学公式和图形界面的动画生成方法,不仅展示了如何使用Python绘制图形,还涉及到如何通过算法控制动态效果,使得动画更加生动和富有变化。

写在后面

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

http://www.xdnf.cn/news/504217.html

相关文章:

  • JAVA GUI
  • 【深度学习-Day 12】从零认识神经网络:感知器原理、实现与局限性深度剖析
  • 令牌桶和漏桶算法使用场景解析
  • HDCleaner:深度清理与优化,提升系统性能
  • 六、磁盘划分与磁盘配额
  • Redis 发布订阅模式深度解析:原理、应用与实践
  • AI:人形机器人一定是人的形状吗?
  • 超长文本能取代RAG吗
  • 计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)
  • 深入探讨 Java Switch Expressions
  • 期望是什么:(无数次的均值,结合概率)21/6=3.5
  • AI大模型(一)embedding模型的基础使用
  • AGI大模型(21):混合检索之混合搜索
  • Git Worktree 使用
  • 【Einops】Einops rearrange方法详解
  • C# 创建线程的方式
  • 一字典两世界:优雅移除 `NSDictionary` 指定键的最佳实践
  • 编程基础:什么是变量
  • 《 C语言中const修饰指针变量的用法与解析》
  • 解决米勒补偿右边零点的方法
  • 【蓝桥杯省赛真题51】python石头运输 第十五届蓝桥杯青少组Python编程省赛真题解析
  • mcp学习笔记
  • day 28
  • ECS/GEM是半导体制造业的标准通信协议中host和equipment的区别是什么,在交互过程中,如何来定位角色谁为host,谁为equipment
  • Spring Boot 中 MyBatis 与 Spring Data JPA 的对比介绍
  • 【Python 算法零基础 3.递推】
  • 【C语言】链接与编译(编译环境 )
  • 配置ssh服务-ubuntu到Windows拷贝文件方法
  • Java Records:简洁的数据建模新方式
  • ubuntu 24.04安装ros1 noetic