shrink_ratio控制爱心大小

发布时间:2025-06-24 19:12:59  作者:北方职教升学中心  阅读量:934


3.3 calc_position方法
defcalc_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)returnx -dx,y -dy

这个方法用于计算每个点在动画过程中移动的偏移量。

5. 主程序和显示

deflove():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()
  • 创建主窗口并设置其尺寸和标题。

6. 总结

这段代码通过使用 tkinter和数学函数,创建了一个动态的爱心动画,展现了光晕效果和扩散效果,使得爱心看起来更加生动和浪漫。

  • 使用 heart_functionshrink方法来计算爱心边缘的点,并将它们加入 all_points列表。
  • math:用于数学计算,特别是三角函数和对数运算,用于生成爱心形状的数学公式。
  • heartcolor:定义了爱心的颜色。heart_function(t)是计算爱心形状的函数。通过对动画帧的控制,爱心的形状和运动轨迹会不断变化,生成了一个流畅的动态效果。

    跳动的爱心

    系列文章

    序号直达链接
    表白系列
    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语言实现李峋同款可写字版跳动的爱心的完整代码。

  • 4.2 scatter_inside
    defscatter_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)returnx -dx,y -dy
    • 模拟点的散射效果,控制点在爱心内部的分布。
    • heartxhearty:爱心的中心坐标。

      1. 导入库

      importtkinter astkimporttkinter.messageboximportrandomfrommath importsin,cos,pi,logfromtkinter.constants import*
      • tkinter:用于创建图形用户界面(GUI)。边缘扩散效果点和中心扩散效果点。
      • 使用 draw函数每隔一定时间刷新一次画布,渲染新的帧。
      • self.random_halo:用于控制光晕效果的强度。

      3. Heart 类

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

    • self.build(2000):构建爱心形状和扩散效果。self._edge_diffusion_points
    • halo_radiushalo_number控制了光晕的半径和数量。
    3.2 build方法
    defbuild(self,number):for_ inrange(number):t =random.uniform(0,2*pi)x,y =heart_function(t)self._points.add((x,y))
    • self._points:通过生成随机的 t值,计算出爱心形状的点。偏移量的计算考虑了距离和比例,并加入了一些随机偏差,使得效果更加自然。

      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_frame    forframe inrange(generate_frame):self.calc(frame)
      • self._points

        3.4 calc方法
        defcalc(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_ inrange(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)notinheart_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))
        • 计算每一帧的变化,更新爱心的点和光晕效果。它展示了一个动态变化的爱心效果,并在屏幕中间显示 “I Love You!” 文字。
        • self.generate_frame:决定生成的帧数,用于控制动画的流畅度。
        • word:定义了显示在屏幕上的文字内容。
        • random:用于生成随机数,控制动画中的随机效果。
        4.3 shrink
        defshrink(x,y,ratio):force =-1/(((x -heartx)**2+(y -hearty)**2)**0.6)dx =ratio *force *(x -heartx)dy =ratio *force *(y -hearty)returnx -dx,y -dy
        • 通过计算一个缩放因子来调整点的位置,使其从爱心的中心向外扩展或收缩。
        4.4 curve
        defcurve(p):return2*(2*sin(4*p))/(2*pi)
        • 用于生成平滑的周期性变化,控制动画中的点移动。
        • side:定义了爱心图案的初始大小。
        • 点的大小由 size控制,颜色是 heartcolor
        • 在窗口中间显示 “I Love You!” 文字。代码包含了多个功能模块,下面将逐一分析每个部分的功能和工作原理。
        • self.all_points:保存每一帧的所有点数据。

          写在最后

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

    4. 辅助函数

    4.1 heart_function
    defheart_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_ratio    y *=shrink_ratio    x +=heartx    y +=hearty    returnint(x),int(y)
    • 该函数根据 t参数计算出爱心的坐标,使用的是数学公式生成爱心形状的点。
    • tkinter.constants:提供一些常用常量,例如用于定位和对齐的常量(如 CENTER)。self._center_diffusion_points:分别存储爱心的原始点、
    • 扩散效果:通过向 self._edge_diffusion_pointsself._center_diffusion_points中添加更多的点来实现边缘和中心的扩散效果。
    • 创建一个画布并使用 Heart类生成爱心效果。
    3.5 render方法
    defrender(self,render_canvas,render_frame):forx,y,size inself.all_points[render_frame %self.generate_frame]:render_canvas.create_rectangle(x,y,x +size,y +size,width=0,fill=heartcolor)
    • 渲染当前帧的所有点,使用 create_rectangle方法在画布上绘制矩形来表示每个点。这不仅是一个简单的 GUI 程序,还融合了数学和物理模拟的概念。
    • shrink_ratio控制爱心大小。

    2. 全局变量定义

    width =888height =500heartx =width /2hearty =height /2side =11heartcolor ="skyblue"# 爱心颜色,可修改word ="I Love You!"# 想要写的字,可修改
    • widthheight:定义了画布的宽度和高度。

      完整代码

      importtkinter astkimporttkinter.messageboximportrandomfrommath importsin,cos,pi,logfromtkinter.constants import*width =888height =500heartx =width /2hearty =height /2side =11heartcolor ="skyblue"# 爱心颜色,可修改word ="I Love You!"# 想要写的字,可修改# 爱心类classHeart: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_frame        forframe inrange(generate_frame):self.calc(frame)defbuild(self,number):for_ inrange(number):t =random.uniform(0,2*pi)x,y =heart_function(t)self._points.add((x,y))for_x,_y inlist(self._points):for_ inrange(3):x,y =scatter_inside(_x,_y,0.05)self._edge_diffusion_points.add((x,y))point_list =list(self._points)for_ inrange(4000):x,y =random.choice(point_list)x,y =scatter_inside(x,y,0.17)self._center_diffusion_points.add((x,y))……

      代码分析

      这段代码是使用 tkinter库编写的一个爱心动画程序。