Python爱心代码

news/2024/5/19 14:09:23

爱心效果图:
在这里插入图片描述

完整代码:

import random
from math import sin, cos, pi, log
from tkinter import *# 定义画布尺寸和颜色
CANVAS_WIDTH = 640
CANVAS_HEIGHT = 480
CANVAS_CENTER_X = CANVAS_WIDTH / 2
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2
IMAGE_ENLARGE_FACTOR = 11
HEART_COLOR = "#FF69B4"def generate_heart_coordinate(t, shrink_ratio=IMAGE_ENLARGE_FACTOR):"""生成爱心函数的坐标:param t: 参数,控制爱心的形状:param shrink_ratio: 爱心的缩放比例:return: 爱心的坐标 (x, y)"""# 基础函数,生成爱心的基本形状x = 16 * (sin(t) ** 3)y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))# 放大爱心x *= shrink_ratioy *= shrink_ratio# 将爱心移到画布中央x += CANVAS_CENTER_Xy += CANVAS_CENTER_Yreturn int(x), int(y)def scatter_inside(x, y, beta=0.15):"""随机内部扩散,用于生成爱心内部的点:param x: 原点的 x 坐标:param y: 原点的 y 坐标:param beta: 扩散强度:return: 新点的坐标 (x, y)"""ratio_x = - beta * log(random.random())ratio_y = - beta * log(random.random())dx = ratio_x * (x - CANVAS_CENTER_X)dy = ratio_y * (y - CANVAS_CENTER_Y)return x - dx, y - dydef shrink_coordinate(x, y, ratio):"""抖动效果,用于调整爱心的跳动:param x: 原点的 x 坐标:param y: 原点的 y 坐标:param ratio: 抖动的比例:return: 新点的坐标 (x, y)"""force = -1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.6)  # 调整爱心跳动的参数dx = ratio * force * (x - CANVAS_CENTER_X)dy = ratio * force * (y - CANVAS_CENTER_Y)return x - dx, y - dydef custom_curve(p):"""自定义曲线函数,调整跳动周期:param p: 参数,控制曲线的形状:return: 正弦值,用于调整爱心的跳动"""# 可以尝试换其他的动态函数,达到更有力量的效果(如贝塞尔曲线)return 2 * (2 * sin(4 * p)) / (2 * pi)class BeatingHeart:"""跳动的爱心类"""def __init__(self, generate_frame=20):self._original_points = set()  # 原始爱心的坐标集合self._edge_diffusion_points = set()  # 边缘扩散效果的点坐标集合self._center_diffusion_points = set()  # 中心扩散效果的点坐标集合self.all_frame_points = {}  # 每帧的动态点坐标self.build(2000)self.random_halo = 1000self.generate_frame = generate_framefor frame in range(generate_frame):self.calculate_frame(frame)def build(self, number_of_points):# 生成原始爱心的坐标for _ in range(number_of_points):t = random.uniform(0, 2 * pi)  # 随机参数,用于生成不完整的爱心x, y = generate_heart_coordinate(t)self._original_points.add((x, y))# 生成爱心内扩散的点for x, y in list(self._original_points):for _ in range(3):x, y = scatter_inside(x, y, 0.05)self._edge_diffusion_points.add((x, y))# 生成爱心内再次扩散的点point_list = list(self._original_points)for _ in range(6000):x, y = random.choice(point_list)x, y = scatter_inside(x, y, 0.17)self._center_diffusion_points.add((x, y))@staticmethoddef calculate_position(x, y, ratio):# 调整缩放比例force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.520)  # 调整爱心跳动的参数dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-1, 1)dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)return x - dx, y - dydef calculate_frame(self, frame_number):ratio = 10 * custom_curve(frame_number / 10 * pi)  # 圆滑的周期的缩放比例halo_radius = int(4 + 6 * (1 + custom_curve(frame_number / 10 * pi)))halo_number = int(3000 + 4000 * abs(custom_curve(frame_number / 10 * pi) ** 2))all_points = []# 生成光环的点heart_halo_points = set()for _ in range(halo_number):t = random.uniform(0, 4 * pi)x, y = generate_heart_coordinate(t, shrink_ratio=11.5)x, y = shrink_coordinate(x, y, halo_radius)if (x, y) not in heart_halo_points:# 处理新的点heart_halo_points.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))# 生成爱心轮廓的点for x, y in self._original_points:x, y = self.calculate_position(x, y, ratio)size = random.randint(1, 3)all_points.append((x, y, size))# 生成爱心内容的点for x, y in self._edge_diffusion_points:x, y = self.calculate_position(x, y, ratio)size = random.randint(1, 2)all_points.append((x, y, size))for x, y in self._center_diffusion_points:x, y = self.calculate_position(x, y, ratio)size = random.randint(1, 2)all_points.append((x, y, size))self.all_frame_points[frame_number] = all_pointsdef render(self, render_canvas, render_frame):for x, y, size in self.all_frame_points[render_frame % self.generate_frame]:render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=HEART_COLOR)def draw(main_window, render_canvas, render_heart, render_frame=0):render_canvas.delete('all')render_heart.render(render_canvas, render_frame)main_window.after(160, draw, main_window, render_canvas, render_heart, render_frame + 1)if __name__ == '__main__':root = Tk()root.title('Beating Heart')canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)canvas.pack()heart = BeatingHeart()draw(root, canvas, heart)Label(root, text="stormsha", bg="black", fg="#FF69B4", ).place(relx=.5, rely=.5, anchor=CENTER)# 在爱心中间加上字Label(root, text="点燃我 温暖你", bg="black", fg="#FF69B4", font=('宋体', 18)).place(relx=.50, rely=.1, anchor=CENTER)# 在爱心上面加上字root.mainloop()

实现思路:

  1. 首先,我们定义了画布的尺寸和颜色,以及一些常量,如爱心的缩放比例和颜色。
  2. 然后,我们定义了一些函数来生成爱心的坐标和调整爱心的形状,如generate_heart_coordinate函数用于生成爱心的基本形状,scatter_inside函数用于生成爱心内部的点,shrink_coordinate函数用于调整爱心的跳动,custom_curve函数用于调整爱心的跳动周期。
  3. 接下来,我们定义了一个BeatingHeart类,它包含了爱心的所有信息,如原始爱心的坐标、边缘扩散效果的点坐标、中心扩散效果的点坐标等。在类的构造函数中,我们调用了build函数来生成这些信息。
  4. build函数中,我们首先生成了原始爱心的坐标,然后生成了爱心内扩散的点和爱心内再次扩散的点。
  5. 然后,我们定义了一个calculate_frame函数,它用于计算每帧的动态点坐标。在这个函数中,我们首先计算了缩放比例和光环的半径和数量,然后生成了光环的点、爱心轮廓的点和爱心内容的点。
  6. 最后,我们定义了一个render函数,它用于将爱心绘制到画布上。在这个函数中,我们遍历了每帧的动态点坐标,并使用create_rectangle函数将它们绘制到画布上。
  7. 在主函数中,我们首先创建了一个Tkinter窗口,然后创建了一个画布,并将爱心绘制到画布上。最后,我们在爱心中间和上面添加了一些文字,并启动了Tkinter的主循环。

http://www.mrgr.cn/p/10331135

相关文章

爬虫2(页面解析和数据提取)

爬虫2(页面解析和数据提取)处理HTML文件,常用Xpath,先将HTML文件转换成XML文档,然后用Xpath查找HTML节点或元素。 一、HTML与XML二、XPath1、XPath路径表达式三、Lxml库html = etree.HTML(text) # 将字符串转换成HTML格式# print(etree.tostring(html)) # 补全HTMLresul…

平芯微PW7014中文规格书

产品概述PW7014 具有前端过电压和过温保护功能。 支持 3V 到 36V 的宽输入电压工作范围。 过压保护阈值可以外部设置 4V~22V 或采用内部默认 6.1V 设置。 超快的过压保护响应速度能够确保后级电路的安全。 集成了超低导通阻抗的 nFET 开关, 确保电路系统应用更好的性能。 它可…

hp惠普插入耳机右下角提示检测到音频设备 取消提醒弹窗

前言全局说明系统 Windows 11一、插入耳机屏幕右下角提示二、关闭提示 1.点击提示框 “个性化我的音频” 按钮2. 点“取消”,取消测试3. 去掉 "当检测到新的受支持设备时通知我" 前面的勾(如下图)再插耳机时候就不会有右下角提示了免责声明:本号所涉及内容仅供安…

使用PlantUML绘制活动图、泳道图

最近在学PlantUML 太漂亮了 给大家欣赏一下 我也记录一下 startuml |使用前| start :用户打开旅游App; |#LightSkyBlue|使用后| :用户浏览旅游信息; |#AntiqueWhite|登机前| :用户办理登机手续; :系统生成登机牌; |使用前| :用户到达机场; |登机前| :用户通过安检; |#Light…

Hadoop3:HDFS、YARN、MapReduce三部分的架构概述及三者间关系(Hadoop入门必须记住的内容)

一、HDFS架构概述 Hadoop Distributed File System,简称HDFS,是一个分布式文件系统。 1)NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件…

Chartist.js折线图(三)

事件替换图形代码如下<!DOCTYPE html> <html><head><link rel="stylesheet" href="./chartist.min.css"><script src="./chartist.min.js"></script></head><body><div class="ct-char…

Linux给文件内容每行指定字符数据脱敏替换

需求:文件内容中有一批手机号,现在需要对手机号的第4-8位进行数据脱敏处理,我们可以用 sed 命令来截取字符替换操作sed s/./*/4 tel.txt | sed s/./*/5 | sed s/./*/6 | sed s/./*/7 | sed s/./*/8

Web3钱包开发获取测试币-Polygon Mumbai(一)

Web3钱包开发获取测试币-Polygon Mumbai(一) 由于主网区块链上的智能合约需要真正的代币&#xff0c;而部署和使用需要花费真金白银&#xff0c;因此测试网络为 Web3 开发人员提供了一个测试环境&#xff0c;用于部署和测试他们的智能合约&#xff0c;以识别和修复在将智能合约…

powershell@命令行提示符样式配置自定义@pwsh重写prompt显示电量内存时间等信息

文章目录 abstract流行的powershell prompt模块示例 powershell原生修改Prompt函数配置文档Prompt命令来自哪里 简单修改带上电量和时间的Prompt 复杂修改预览FAQ:没有必要修改相关仓库地址样式选择平衡样式花哨样式响应性能 小结 abstract 在 PowerShell 中&#xff0c;可以通…

nginx高性能负载均衡集群

高性能负载均衡集群 一、集群是什么简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 这些服务器之间可以彼此通信,协同向用户提供应用程序,系统…

机器学习day1

一、人工智能三大概念 人工智能三大概念 人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09; 人工智能&#xff1a;人工智能是研究计算代理的合成和分析的领域。人工智能是使用计算机来模拟&#xff0c;而不是人类…

动态内存管理 柔性数组

文章目录 动态内存函数 malloc freecallocrealloc 重新开辟空间realloc 也可以第一个参数为NULL&#xff0c;则是直接开辟内存&#xff0c;类似于malloc用法 常见的动态内存错误对空指针进行解引用操作对开辟的内存越界访问对非动态开辟的内存使用free释放使用free释放动态开辟…

ABS10-ASEMI开关电源整流桥ABS10

ABS10-ASEMI开关电源整流桥ABS10编辑:ll ABS10-ASEMI开关电源整流桥ABS10 型号:ABS10 品牌:ASEMI 封装:ABS-4 正向电流(Id):1A 反向耐压(VRRM):1000V 正向浪涌电流:30A 正向电压(VF):1.10V 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 功率(Pd):小功率设备 工作温…

揭露 FileSystem 引起的线上 JVM 内存溢出问题

本文主要介绍了由FileSystem类引起的一次线上内存泄漏导致内存溢出的问题分析解决全过程。作者:来自 vivo 互联网大数据团队-Ye Jidong本文主要介绍了由FileSystem类引起的一次线上内存泄漏导致内存溢出的问题分析解决全过程。内存泄漏定义(memory leak):一个不再被程序使用…

Docker镜像的创建 和 Dockerfile

一. Docker 镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于 Dockerfile 创建。 1 基于现有镜像创建 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改docker run -it --name web3 centos:7 /bin/bash …

nginx高级篇之location高级实战

nginx location高级实战location是nginx的核心重要功能,可以设置网站的访问路径,一个web server会有多个路径,那么location就得设置多个。 Nginx的locaiton作用是根据用户请求的URI不同,来执行不同的应用。 针对用户请求的网站URL进行匹配,匹配成功后进行对应的操作。1.语…

【树莓派】yolov5 Lite,目标检测,行人检测入侵报警

延续之前的程序&#xff1a; https://qq742971636.blog.csdn.net/article/details/138172400 文章目录 播放声音pygame不出声音怎么办&#xff08;调节音量&#xff09;树莓派上的音乐播放器&#xff08;可选&#xff09;命令行直接放歌&#xff08;尝试放mp3歌曲&#xff09; …

一般神经网络的微分与网络参数的初始化

(文章的主要内容来自电科的顾亦奇老师的 Mathematical Foundation of Deep Learning, 有部分个人理解) 一般深度神经网络的微分 上周讨论的前向和反向传播算法可以推广到任意深度神经网络的微分。 对于一般的网络来说&#xff0c;可能无法逐层分割&#xff0c;但仍然可以用流…

第十五届蓝桥杯省赛第二场C/C++B组D题【前缀总分】题解(AC)

暴力解法 O ( 26 n 5 ) O(26n^5) O(26n5) 枚举将第 i i i 个字符串的第 j j j 个字符改为 c c c 的所有方案&#xff0c;时间复杂度 O ( 26 n 2 ) O(26n^2) O(26n2)&#xff0c;修改并计算总分&#xff0c; O ( n 3 ) O(n^3) O(n3)。 暴力优化 O ( 26 n 3 log ⁡ n ) O…

openGauss 函数

函数 openGauss常用的函数如下: 数学函数abs(x) 描述:绝对值。 返回值类型:和输入相同。 示例: openGauss=# SELECT abs(-17.4);abs ------17.4 (1 row)cbrt(dp) 描述:立方根。 返回值类型:double precision 示例: openGauss=# SELECT cbrt(27.0);cbrt ------3 (1 row)c…