Python跳动的双爱心
系列文章
序号 | 直达链接 |
---|---|
Tkinter | |
1 | Python李峋同款可写字版跳动的爱心 |
2 | Python跳动的双爱心 |
3 | Python蓝色跳动的爱心 |
4 | Python动漫烟花 |
5 | Python粒子烟花 |
Turtle | |
1 | Python满屏飘字 |
2 | Python蓝色流星雨 |
3 | Python金色流星雨 |
4 | Python漂浮爱心 |
5 | Python爱心光波① |
6 | Python爱心光波② |
7 | Python满天繁星 |
8 | Python五彩气球 |
9 | Python白色飘雪 |
10 | Python七彩花朵 |
11 | Python 3D星空 |
12 | Python大雪纷飞 |
13 | Python一闪一闪亮星星 |
14 | Python爱心泡泡 |
15 | Python爱心射线 |
16 | Python圣诞礼物 |
17 | Python礼物圣诞树 |
18 | Python浪漫星空 |
19 | Python飞舞蝙蝠 |
20 | Python万圣礼物 |
21 | Python蓝色飘雪 |
Pygame | |
1 | Python跨年烟花 |
2 | Python炫酷烟花 |
3 | Python黑客帝国字母雨 |
敬请期待…… |
写在前面
Python实现跳动的双爱心的完整代码。
技术需求
1. Tkinter图形界面库
- Tkinter:用于创建图形用户界面(GUI)。通过
Tkinter
库,代码能够创建全屏窗口、绘制画布并控制动画的显示。它是Python中用于GUI开发的标准库之一,支持创建按钮、文本框、画布等图形界面元素。
2. 数学计算与函数
- 数学公式:通过数学公式生成心形曲线坐标。利用了三角函数(
sin
、cos
)和常量pi
来实现心形的形状。这部分涉及基本的数学建模,用于确定心形图案。 - 对数和指数函数:用来生成散点、扩散点和随机光晕的效果。例如,
log(random.random())
用于生成随机散点,模拟心形的扩散效果。
3. 随机数生成与噪声
- 随机数生成:
random
库用于生成随机数,帮助创建不规则的散点、光晕扩散等效果,使得心形的动画看起来更加自然和动态。 - 噪声模拟:通过调整点的位置(例如
scatter_points
和shrink_points
函数中的随机偏移),模拟自然现象中的随机噪声。
4. 动画与帧更新
- 帧更新:通过
main.after
方法实现动画的逐帧更新。每一帧都会删除上一帧的图形并绘制新的图形,实现动画效果。 - 时间延迟:使用
FRAME_DELAY
来控制每一帧的播放速度,从而影响动画的流畅度。
5. 坐标系和几何变换
- 坐标系变换:通过对心形坐标的缩放、旋转等操作,结合
shrink_points
等函数,实现心形图案的动态变换(例如,缩小、偏移等)。 - 几何变换:代码中涉及了坐标的平移、缩放和旋转,使得动画中的心形能够动态变化,增加视觉效果。
6. 面向对象编程
- 类与对象:使用面向对象编程(OOP)的方式设计了
Heart
和HeartParameters
两个类,分别管理心形参数和动画中的点集。通过这种方式,代码结构更加清晰,易于扩展和维护。 - 封装与方法:类内部的方法负责管理和更新数据(如点的生成和位置更新),提高了代码的可读性和复用性。
7. 图形绘制与颜色控制
- Canvas绘制:使用
Canvas
组件进行图形绘制。create_rectangle
方法用于在画布上绘制心形的点,形成动态的效果。 - 颜色控制:通过设置
INNER_HEART_COLOR
和OUTER_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_COLOR
和OUTER_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)
该函数定义了心形的数学方程:
- 通过
sine
和cosine
函数的组合,生成心形曲线的(x, y)坐标。 shrink_ratio
用于缩放心形的大小,CANVAS_CENTER_X
和CANVAS_CENTER_Y
用于将心形的坐标移至画布中心。
5. scatter_points
和shrink_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绘制图形,还涉及到如何通过算法控制动态效果,使得动画更加生动和富有变化。
写在后面
我是一只有趣的兔子,感谢你的喜欢。