Python跳动的爱心

跳动的爱心

系列文章

序号直达链接
表白系列
1Python制作一个无法拒绝的表白界面
2Python满屏飘字表白代码
3Python无限弹窗满屏表白代码
4Python李峋同款可写字版跳动的爱心
5Python流星雨代码
6Python漂浮爱心代码
7Python爱心光波代码
8Python普通的玫瑰花代码
9Python炫酷的玫瑰花代码
10Python多彩的玫瑰花代码
节日系列
1Python动漫风烟花秀代码
2Python新年烟花秀代码
3Python圣诞礼物代码
4Python画圣诞树代码
5Python可爱版圣诞树丨绿色
6Python可爱版圣诞树丨粉色
7Python大雪纷飞代码
8Python生日蛋糕代码
9Python五彩气球代码
10Python国庆祝福代码
11Python万圣礼物代码
12Python愚人节礼物代码
13Python浪漫星空代码
14Python樱花树代码
动漫系列
1Python名侦探柯南
2Python喜羊羊
3Python懒羊羊
4Python沸羊羊
5Python小灰灰
6Python小香香
7Python灰太狼
8Python海绵宝宝
9Python哆啦A梦
10Python凯蒂猫
11Python猫和老鼠
12Python草莓熊
13Python迷你皮卡丘
14Python高级皮卡丘
15Python豪华皮卡丘
16Python史迪仔
17Python小熊猫
18Python蜘蛛侠
19Python可爱版蜡笔小新
20Python萌萌的蜡笔小新
21Python罗小黑
22Python猪猪侠
炫酷系列
1  Python张万森下雪了
2Python一闪一闪亮晶晶
3Python黑客帝国代码雨
4Python七彩花朵
5Python模拟3D星空
6Python金榜题名
7Python满天星

文章目录

  • 系列文章
  • 写在前面
  • 完整代码
  • 代码分析
      • 1. 导入库
      • 2. 全局变量定义
      • 3. Heart 类
        • 3.1 `__init__` 方法
        • 3.2 `build` 方法
        • 3.3 `calc_position` 方法
        • 3.4 `calc` 方法
        • 3.5 `render` 方法
      • 4. 辅助函数
        • 4.1 `heart_function`
        • 4.2 `scatter_inside`
        • 4.3 `shrink`
        • 4.4 `curve`
      • 5. 主程序和显示
      • 6. 总结
  • 写在最后

写在前面

Python语言实现李峋同款可写字版跳动的爱心的完整代码。

完整代码

import tkinter as tk
import tkinter.messagebox
import random
from math import sin, cos, pi, log
from tkinter.constants import *width = 888
height = 500
heartx = width / 2
hearty = height / 2
side = 11
heartcolor = "skyblue"  # 爱心颜色,可修改
word = "I Love You!"  # 想要写的字,可修改# 爱心类
class Heart:def __init__(self, generate_frame=20):self._points = set()  # 原始爱心坐标集合self._edge_diffusion_points = set()  # 边缘扩散效果点坐标集合self._center_diffusion_points = set()  # 中心扩散效果点坐标集合self.all_points = {}  # 每帧动态点坐标self.build(2000)self.random_halo = 1000self.generate_frame = generate_framefor frame in range(generate_frame):self.calc(frame)def build(self, number):for _ in range(number):t = random.uniform(0, 2 * pi)x, y = heart_function(t)self._points.add((x, y))for _x, _y in list(self._points):for _ in range(3):x, y = scatter_inside(_x, _y, 0.05)self._edge_diffusion_points.add((x, y))point_list = list(self._points)for _ in range(4000):x, y = random.choice(point_list)x, y = scatter_inside(x, y, 0.17)self._center_diffusion_points.add((x, y))
……

代码分析

这段代码是使用 tkinter 库编写的一个爱心动画程序。它展示了一个动态变化的爱心效果,并在屏幕中间显示 “I Love You!” 文字。代码包含了多个功能模块,下面将逐一分析每个部分的功能和工作原理。

1. 导入库

import tkinter as tk
import tkinter.messagebox
import random
from math import sin, cos, pi, log
from tkinter.constants import *
  • tkinter:用于创建图形用户界面(GUI)。
  • random:用于生成随机数,控制动画中的随机效果。
  • math:用于数学计算,特别是三角函数和对数运算,用于生成爱心形状的数学公式。
  • tkinter.constants:提供一些常用常量,例如用于定位和对齐的常量(如 CENTER)。

2. 全局变量定义

width = 888
height = 500
heartx = width / 2
hearty = height / 2
side = 11
heartcolor = "skyblue"  # 爱心颜色,可修改
word = "I Love You!"  # 想要写的字,可修改
  • widthheight:定义了画布的宽度和高度。
  • heartxhearty:爱心的中心坐标。
  • side:定义了爱心图案的初始大小。
  • heartcolor:定义了爱心的颜色。
  • word:定义了显示在屏幕上的文字内容。

3. Heart 类

Heart 类负责生成和渲染动态的爱心效果。

3.1 __init__ 方法
def __init__(self, generate_frame=20):self._points = set()  # 原始爱心坐标集合self._edge_diffusion_points = set()  # 边缘扩散效果点坐标集合self._center_diffusion_points = set()  # 中心扩散效果点坐标集合self.all_points = {}  # 每帧动态点坐标self.build(2000)self.random_halo = 1000self.generate_frame = generate_framefor frame in range(generate_frame):self.calc(frame)
  • self._pointsself._edge_diffusion_pointsself._center_diffusion_points:分别存储爱心的原始点、边缘扩散效果点和中心扩散效果点。
  • self.all_points:保存每一帧的所有点数据。
  • self.build(2000):构建爱心形状和扩散效果。
  • self.random_halo:用于控制光晕效果的强度。
  • self.generate_frame:决定生成的帧数,用于控制动画的流畅度。
3.2 build 方法
def build(self, number):for _ in range(number):t = random.uniform(0, 2 * pi)x, y = heart_function(t)self._points.add((x, y))
  • self._points:通过生成随机的 t 值,计算出爱心形状的点。heart_function(t) 是计算爱心形状的函数。
  • 扩散效果:通过向 self._edge_diffusion_pointsself._center_diffusion_points 中添加更多的点来实现边缘和中心的扩散效果。
3.3 calc_position 方法
def calc_position(x, y, ratio):force = 1 / (((x - heartx) ** 2 + (y - hearty) ** 2) ** 0.520)  # 魔法参数dx = ratio * force * (x - heartx) + random.randint(-1, 1)dy = ratio * force * (y - hearty) + random.randint(-1, 1)return x - dx, y - dy

这个方法用于计算每个点在动画过程中移动的偏移量。偏移量的计算考虑了距离和比例,并加入了一些随机偏差,使得效果更加自然。

3.4 calc 方法
def calc(self, generate_frame):ratio = 10 * curve(generate_frame / 10 * pi)halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))halo_number = int(3000 + 4000 * abs(curve(generate_frame / 10 * pi) ** 2))all_points = []heart_halo_point = set()for _ in range(halo_number):t = random.uniform(0, 2 * pi)x, y = heart_function(t, shrink_ratio=11.6)x, y = shrink(x, y, halo_radius)if (x, y) not in heart_halo_point:heart_halo_point.add((x, y))x += random.randint(-14, 14)y += random.randint(-14, 14)size = random.choice((1, 2, 2))all_points.append((x, y, size))
  • 计算每一帧的变化,更新爱心的点和光晕效果。
  • halo_radiushalo_number 控制了光晕的半径和数量。
  • 使用 heart_functionshrink 方法来计算爱心边缘的点,并将它们加入 all_points 列表。
3.5 render 方法
def render(self, render_canvas, render_frame):for x, y, size in self.all_points[render_frame % self.generate_frame]:render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=heartcolor)
  • 渲染当前帧的所有点,使用 create_rectangle 方法在画布上绘制矩形来表示每个点。
  • 点的大小由 size 控制,颜色是 heartcolor

4. 辅助函数

4.1 heart_function
def heart_function(t, shrink_ratio: float = side):x = 16 * (sin(t) ** 3)y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))x *= shrink_ratioy *= shrink_ratiox += heartxy += heartyreturn int(x), int(y)
  • 该函数根据 t 参数计算出爱心的坐标,使用的是数学公式生成爱心形状的点。
  • shrink_ratio 控制爱心大小。
4.2 scatter_inside
def scatter_inside(x, y, beta=0.15):ratio_x = - beta * log(random.random())ratio_y = - beta * log(random.random())dx = ratio_x * (x - heartx)dy = ratio_y * (y - hearty)return x - dx, y - dy
  • 模拟点的散射效果,控制点在爱心内部的分布。
4.3 shrink
def shrink(x, y, ratio):force = -1 / (((x - heartx) ** 2 + (y - hearty) ** 2) ** 0.6)dx = ratio * force * (x - heartx)dy = ratio * force * (y - hearty)return x - dx, y - dy
  • 通过计算一个缩放因子来调整点的位置,使其从爱心的中心向外扩展或收缩。
4.4 curve
def curve(p):return 2 * (2 * sin(4 * p)) / (2 * pi)
  • 用于生成平滑的周期性变化,控制动画中的点移动。

5. 主程序和显示

def love():root = tk.Tk()screenwidth = root.winfo_screenwidth()screenheight = root.winfo_screenheight()x = (screenwidth - width) // 2y = (screenheight - height) // 2 - 66root.geometry("%dx%d+%d+%d" % (width, height, x, y))root.title("❤")canvas = tk.Canvas(root, bg='black', height=height, width=width)canvas.pack()heart = Heart()draw(root, canvas, heart)tk.Label(root, text=word, bg="black", fg="skyblue", font="Helvetic 25 bold").place(relx=.5, rely=.5, anchor=CENTER)root.mainloop()
  • 创建主窗口并设置其尺寸和标题。
  • 创建一个画布并使用 Heart 类生成爱心效果。
  • 使用 draw 函数每隔一定时间刷新一次画布,渲染新的帧。
  • 在窗口中间显示 “I Love You!” 文字。

6. 总结

这段代码通过使用 tkinter 和数学函数,创建了一个动态的爱心动画,展现了光晕效果和扩散效果,使得爱心看起来更加生动和浪漫。通过对动画帧的控制,爱心的形状和运动轨迹会不断变化,生成了一个流畅的动态效果。这不仅是一个简单的 GUI 程序,还融合了数学和物理模拟的概念。

写在最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极验决策引擎如何凭借独特优势,弯道超车传统风控?

前言 市场上的规则决策引擎产品众多,但大多局限于IP、设备、账号等层面,提供的是现成的风控标签和规则。然而,真正的风控,需要的不仅仅是标签和规则。 极验的业务规则决策引擎与众不同,这款决策引擎以界面流程编排为…

windows如何使用ssh连接kali

声明: 昨天晚上看了小羽老师的直播课,心血来潮自己也想搞一下这个ssh,中途安装遇到了不少问题,电脑也是重启了好多次,遇到bug就重启也是解决bug的一种方法. 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&…

SpringMvc完整知识点一

SpringMVC概述 定义 SpringMVC是一种基于Java实现MVC设计模型的轻量级Web框架 MVC设计模型:即将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离…

路由器、二层交换机与三层交换机的区别与应用

路由器、二层交换机和三层交换机是常见的网络设备,常常协同工作。它们都可以转发数据,但在功能、工作层级以及应用场景上存在差异。 1. 工作层级 三者在OSI模型中的工作层级不同: 路由器: 工作在 网络层(第三层&#…

Spring Boot 指定外部配置路径

优先级 外部 > 内部 目录结构: conf/… app.jar 启动命令 java -jar --spring.config.locationfile:/conf/ app.jar

(css)element中el-select下拉框整体样式修改

(css)element中el-select下拉框整体样式修改 重点代码(颜色可行修改) // 修改input默认值颜色 兼容其它主流浏览器 /deep/ input::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.50); } /deep/ input::-moz-input-placeholder {color: rgba…

SEC_ASA 第一天作业

拓扑: 实验需求: 注意:在开始作业之前必须先读“前言”,以免踩坑!!!(☞敢点我试试) 按照拓扑图配置VLAN连接。 注意:ASA防火墙的 Gi0/1口需要起子接口&#x…

「Mac玩转仓颉内测版45」小学奥数篇8 - 排列组合计算

本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。 关键词 小学奥数Python Cangjie排列与组合 一、题目描述 编写一个程序,计算从 n 个不同元素中取…

Ungoogled Chromium127编译指南 Windows篇 - 获取源码(七)

1. 引言 在完成所有必要工具的安装和配置后,我们进入了Ungoogled Chromium编译过程的第一个关键阶段:获取源代码。本文将详细介绍如何正确获取和准备Ungoogled Chromium的源代码,为后续的编译工作打下基础。 2. 准备工作 2.1 环境检查 在…

APP、小程序对接聚合广告平台,有哪些广告变现策略?

开发者对接聚合广告平台,可以让自身流量价值最大化,获得更多的广告曝光机会,对接单一的广告联盟容易造成广告填充不足,收益不稳定的问题。#APP广告变现# APP开发者根据应用的生命周期、用户特征和产品定位,选择最适合…

人脸识别Adaface之libpytorch部署

目录 1. libpytorch下载2. Adaface模型下载3. 模型转换4. c推理4.1 前处理4.2 推理4.3 编译运行4.3.1 写CMakeLists.txt4.3.2 编译4.3.3 运行 1. libpytorch下载 参考: https://blog.csdn.net/liang_baikai/article/details/127849577 下载完成后,将其解…

Elasticsearch高性能实践

前言 本方案主要从运维层面分析es是实际生产使用过程中的参数优化,深入理解es各个名词及含义,深入分析es的使用过程中应注意的点,详细解释参数设置的原因以及目的,主要包括系统层面,参数层面。除此之外,优…

在idea中使用mysql(超详细)

一、连接mysql 在IDE开发工具中也是可以使用mysql的,这里以开发java常用的IntelliJ IDEA为例。 1. 打开idea,右上角有数据库侧边栏,打开侧边栏点击加号->数据源,可以看到支持很多数据库,选择mysql。 2. 首次使用需…

Python简化算法工具——“按位运算”

一、六种常见的“按位运算” 1.与(&)运算 运算规则:对两个整数对应的二进制位进行操作,当两个相应的二进制位都为1时,该位的结果才为1,否则为0。 a5 #0101b7 #0111print(a&b)#a&b0101#输出对…

Modbus转Profibus网关:打通多电机交流控制,打造自动化神器

在工业控制领域,Modbus和Profibus是两种非常常见的通信协议。Modbus由于其简单的结构、易于实现的特点被广泛应用在各种电子设备中,而Profibus则以其稳定性和实时性在大型自动化系统中占有一席之地。但是,有时候我们需要将这两种协议进行转换…

《数据流驱动:C++构建 AI 模型持续学习新范式》

在人工智能领域不断发展演进的浪潮中,数据的持续流入和模型的适应性学习成为了新的焦点。传统的人工智能模型训练往往基于固定的数据集,在模型训练完成后难以有效地处理新到达的数据并持续提升性能。而基于数据流的人工智能模型持续学习系统则能够打破这…

C++重点和练习

作业1&#xff1a;实现类中有类的几个特殊成员函数 #include <iostream>using namespace std;class Person {string name;int *age; public:Person():name("none"),age(new int(0)){}Person(int age):age(new int(age)){}Person(string name,int age):name(na…

亚马逊云科技用生成式AI,向开发的复杂性动手了

生成式 AI、分布式扩展功能全面进化&#xff0c;还降价了。 同一天的发布&#xff0c;完全不同的方向。 今天凌晨&#xff0c;云计算巨头亚马逊云科技的 re:Invent 与大号创业公司 OpenAI 的发布「撞了车」。后者公布了一系列生成式 AI 应用&#xff0c;价格更贵、性能更强大&a…

Java 设计模式~工厂模式

在java开发&#xff0c;工厂模式应用场景有哪些&#xff1f;在Spring boot原码中 有哪些工厂类&#xff0c;并做相应的代码介绍。 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是Java中一种常用的创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。此…

【操作系统】实验二:观察Linux,使用proc文件系统

实验二 观察Linux&#xff0c;使用proc文件系统 实验目的&#xff1a;学习Linux内核、进程、存储和其他资源的一些重要特征。读/proc/stat文件&#xff0c;计算并显示系统CPU占用率和用户态CPU占用率。&#xff08;编写一个程序使用/proc机制获得以及修改机器的各种资源参数。…