• Python制作爱心跳动代码,这就是程序员的烂漫吗


    前言

    最近有个剧挺火的 就是那个程序员的剧,叫什么温暖你来着

    咳咳,剧我没怎么看,但是吧,里面有个爱心代码,最近可是蛮火的,今天就用Python来尝试一下吧

    怎么说呢,用这个表白也可以的,万一她也看这个剧呢,万一就成了呢 哈哈

    冲啊,兄弟们

    请添加图片描述

    okok 话不多说,现在开始代码部分

    代码

    模块导入

    import random
    from math import sin, cos, pi, log
    from tkinter import *
    
    • 1
    • 2
    • 3

    源码.点击领取即可

    画布的高和宽

    有些数值咱自己也是可以调改的哈,这里我设置的高和宽是 480:640

    CANVAS_WIDTH = 640  # 画布的宽
    CANVAS_HEIGHT = 480  # 画布的高
    
    • 1
    • 2

    x,y轴坐标

    CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X轴坐标
    CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y轴坐标
    
    • 1
    • 2

    放大比例

    IMAGE_ENLARGE = 11  # 放大比例
    
    • 1

    心的颜色

    这个自己看着改啊,想改啥色就改啥色

    HEART_COLOR = "#ff8181"  # 心的颜色,芜湖我喜欢的粉色
    
    • 1

    函数生成器

    python学习交流Q群:770699889 ### 源码领取
    def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
        """
        “爱心函数生成器”
        :param shrink_ratio: 放大比例
        :param t: 参数
        :return: 坐标
        """
        # 基础函数
        x = 16 * (sin(t) ** 3)
        y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    放大

    # 放大
        x *= shrink_ratio
        y *= shrink_ratio
    
    • 1
    • 2
    • 3

    移到画布中央

    基本操作,我要多发点文字哈哈,不然说我质量不行

        # 移到画布中央
        x += CANVAS_CENTER_X
        y += CANVAS_CENTER_Y
    
        return int(x), int(y)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    请添加图片描述

    随机内部扩散

    def scatter_inside(x, y, beta=0.15):
        """
        随机内部扩散
        :param x: 原x
        :param y: 原y
        :param beta: 强度
        :return: 新坐标
        """
        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)
    python学习交流Q群:770699889 ### 源码领取
        return x - dx, y - dy
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    抖动

    这一步可关键了,咱做的就是跳动的爱心代码,so这一步重中之重

    
    def shrink(x, y, ratio):
        """
        抖动
        :param x: 原x
        :param y: 原y
        :param ratio: 比例
        :return: 新坐标
        """
        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 - dy
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    调整缩放比例

    基本上都可以自己调改到自己喜欢的样子

    @staticmethod
        def calc_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 - dy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    圆滑的周期缩放比例

    python学习交流Q群:770699889 ### 源码领取
        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 = []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    光环

     # 光环
            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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    轮廓

    # 轮廓
            for x, y in self._points:
                x, y = self.calc_position(x, y, ratio)
                size = random.randint(1, 3)
                all_points.append((x, y, size))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    内容

    # 内容
            for x, y in self._edge_diffusion_points:
                x, y = self.calc_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.calc_position(x, y, ratio)
                size = random.randint(1, 2)
                all_points.append((x, y, size))
    
            self.all_points[generate_frame] = all_points
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    最后一步

    马上就完成了,坚持就是胜利

    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(160, draw, main, render_canvas, render_heart, render_frame + 1)
    python学习交流Q群:770699889 ### 源码领取
    
    if __name__ == '__main__':
        root = Tk()  # 一个Tk
        canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
        canvas.pack()
        heart = Heart()  # 心
        draw(root, canvas, heart)  # 开始画画~
        root.mainloop()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    完整代码

    源码.点击领取即可

    在这里插入图片描述

    最后

    其实咱自己也可以动动脑筋,调整一下画布的大小啥的,然后再加些其他的元素上去

    就比如名字,还有什么日期…很多很多

    就看你们怎么操作咯

    好啦,今天的分享到这里就结束了

    对文章有问题的,或者有其他关于python的问题,可以在评论区留言或者私信我哦
    觉得我分享的文章不错的话,可以关注一下我,或者给文章点赞(/≧▽≦)/

    请添加图片描述

  • 相关阅读:
    CCF CSP认证 历年题目自练Day31
    详解位段+枚举+联合(接结构体)
    1.创建项目(wpf视觉项目)
    VB.NET—Bug调试(参数话查询、附近语法错误)
    ChatGPT扇动翅膀后带来的蝴蝶效应
    简单介绍一下tensorflow与pytorch的相互转换(主要是tensorflow转pytorch)
    macOS上制作arm64的jdk17镜像
    「Java核心面试系列」Spring面试核心49问(附答案)
    ChatGPT3.5使用体验
    服务器购买后的五个小技巧
  • 原文地址:https://blog.csdn.net/aliYz/article/details/127796534