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_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_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_Y
    return 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绘制图形,还涉及到如何通过算法控制动态效果,使得动画更加生动和富有变化。

写在后面

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Want595

感谢小伙伴的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值