当前位置: 首页 > news >正文

Python 和HTML5 “跳动的心”动画

基于 Python tkinter 库 “跳动的心”动画

importrandomfrommathimportsin,cos,pi,logfromtkinterimport*# 定义画布尺寸和颜色CANVAS_WIDTH=640CANVAS_HEIGHT=480CANVAS_CENTER_X=CANVAS_WIDTH/2CANVAS_CENTER_Y=CANVAS_HEIGHT/2IMAGE_ENLARGE_FACTOR=11HEART_COLOR="#FF69B4"defgenerate_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_ratio y*=shrink_ratio# 将爱心移到画布中央x+=CANVAS_CENTER_X y+=CANVAS_CENTER_Yreturnint(x),int(y)defscatter_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)returnx-dx,y-dydefshrink_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)returnx-dx,y-dydefcustom_curve(p):""" 自定义曲线函数,调整跳动周期 :param p: 参数,控制曲线的形状 :return: 正弦值,用于调整爱心的跳动 """# 可以尝试换其他的动态函数,达到更有力量的效果(如贝塞尔曲线)return2*(2*sin(4*p))/(2*pi)classBeatingHeart:""" 跳动的爱心类 """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_frameforframeinrange(generate_frame):self.calculate_frame(frame)defbuild(self,number_of_points):# 生成原始爱心的坐标for_inrange(number_of_points):t=random.uniform(0,2*pi)# 随机参数,用于生成不完整的爱心x,y=generate_heart_coordinate(t)self._original_points.add((x,y))# 生成爱心内扩散的点forx,yinlist(self._original_points):for_inrange(3):x,y=scatter_inside(x,y,0.05)self._edge_diffusion_points.add((x,y))
http://www.jsqmd.com/news/551198/

相关文章:

  • 【Vivado实战技巧】多版本共存时如何一键切换默认启动环境
  • VC++老项目改造指南:用MFC配置API替代过时的GetPrivateProfileString(兼容Win10/11)
  • 马吕斯定律在现代光学技术中的关键应用解析
  • 4步打造完美黑苹果:OpCore Simplify让复杂EFI配置小白也能轻松搞定
  • 抖音无水印批量下载开源工具:高效解决方案与合规应用指南
  • HoRain云--彻底卸载OpenClaw:完整指南
  • 单词搜索-leetcode
  • Ring-1T-FP8开源:万亿参数AI推理新突破
  • 颠覆电路设计效率:Draw-io-ECE插件全面解析与实战指南
  • 5大核心功能解锁N_m3u8DL-RE:跨平台流媒体下载终极指南
  • Windows10 22H2 游戏定制优化版!游戏性能优化,Win10专业版、专业工作站版、字体美化版!集成DX游戏组件、离线运行库DLL文件,电脑装机操作系统安装更新升级重装
  • Android 12 HAL开发避坑实录:手把手教你用AIDL在Native层实现一个可开机自启动的Service
  • 实测有效!Qwen3-VL-WEBUI镜像部署教程,快速上手多模态AI
  • SAR成像CS算法实战:从原理到点目标仿真的MATLAB实现
  • 5.JVM-方法区
  • 搭建Gitea并自动拉取代码
  • 春联生成模型-中文-base功能体验:支持多种祝福词,生成对仗工整春联
  • 3分钟掌握Adobe扩展安装效率工具:设计师必备的开源解决方案
  • DiskInfo开源硬盘检测工具:实时监控与健康诊断解决方案
  • 【问题】thor上的cubLas
  • 实战应用构建:基于快马平台开发可部署的智能成片PPT网站
  • Qwen3-0.6B-FP8实战:构建基于操作系统的命令行智能助手
  • 正规的座机号码认证服务商有哪些?固定电话显示企业名称 - 企业服务推荐
  • OptiScaler终极指南:解锁游戏性能与画质的完美平衡
  • 【js基础】继承(原型链继承、组合式继承、寄生组合式继承、class的实现)
  • SWAT建模(学习中)
  • 什么是大模型投毒?大模型投毒原理、路径和案例剖析
  • 告别论文焦虑:Paperxie 如何用四大降重神器搞定毕业论文重复率与 AIGC 率
  • 为你的员工考核提供25个聪明的绩效考核问题
  • 爱芯元智上市后首次年报:营收5.6亿同比增19% 智能汽车业务成增长引擎