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库,代码能够创建全屏窗口、绘制画布并控制动画的显示。它是Python中用于GUI开发的标准库之一,支持创建按钮、文本框、画布等图形界面元素。2. 数学计算与函数
sin、cos)和常量pi来实现心形的形状。这部分涉及基本的数学建模,用于确定心形图案。log(random.random())用于生成随机散点,模拟心形的扩散效果。3. 随机数生成与噪声
random库用于生成随机数,帮助创建不规则的散点、光晕扩散等效果,使得心形的动画看起来更加自然和动态。scatter_points和shrink_points函数中的随机偏移),模拟自然现象中的随机噪声。4. 动画与帧更新
main.after方法实现动画的逐帧更新。每一帧都会删除上一帧的图形并绘制新的图形,实现动画效果。FRAME_DELAY来控制每一帧的播放速度,从而影响动画的流畅度。5. 坐标系和几何变换
shrink_points等函数,实现心形图案的动态变换(例如,缩小、偏移等)。6. 面向对象编程
Heart和HeartParameters两个类,分别管理心形参数和动画中的点集。通过这种方式,代码结构更加清晰,易于扩展和维护。7. 图形绘制与颜色控制
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_Y
return 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_Y
return 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绘制图形,还涉及到如何通过算法控制动态效果,使得动画更加生动和富有变化。
写在后面
我是一只有趣的兔子,感谢你的喜欢。
作者:Want595