• 李峋同款爱心代码!跳动的心,给你爱的人一个惊喜!


    Hello 大家好

    如何浪漫的表白,作为程序员出身的小编,今天就带你实现热播剧《点燃我,温暖你》中超火的李峋同款爱心代码!前面是教程,怕麻烦的朋友可以直接划到文末,下载现成的,下载完成后打开就可以用~。

    先来看看我们做出来的效果~

    图片1

    01 爱心(简单版)

    代码是用HTML语言编写的,我会在文末链接中给出源代码,如果想在女朋友面前小秀一把的可以按我下面的教程做,认真听讲咯~

    ① 打开电脑,在桌面创建【文本文档】

    ② 全选代码,点击【复制】

    ③ 打开【文本文档】,点击【粘贴】

    ④ 修改【文本文档】的后缀名为【.html】

    ⑤ 双击运行即可显示在浏览器中

    图片2

    👉注意事项: ① 有些电脑默认没有显示文件扩展名,需要手动设置。

    alt

    ② 双击 .html 后缀文件无法打开时,可以右键指定打开。

    alt

    02 爱心(定制版)

    上面分享的是简单版本的爱心,表白女朋友当然要是定制化的啦~ 下面介绍的就是添加了背景和定制化文字的爱心,先看成品:

    alt

    代码修改起来非常简单,只需要更换背景就可以了,下面进行技术总结:

    ① 选择喜欢的一张背景图

    ② 使用浏览器打开 URL(因为平台不允许放外链,具体查看文末)

    ③ 上传你选择的背景图

    ④ 拷贝 图片URL地址

    ⑤ 修改代码的第18行后,更改后缀名为 .html

    ⑥ 双击运行 .html文件即可

    alt
    alt

    完整代码下载:

    https://shimo.im/docs/m8AZVzb4E1f6nyAb/

    Python实现

    作为无所不能的Python,这个时候怎么能落后呢,我们来看看Python的实现方式

    import random
    from math import sin, cos, pi, log
    from tkinter import *
    import ctypes

    user32 = ctypes.windll.user32
    CANVAS_WIDTH = user32.GetSystemMetrics(0)  # 画布的宽
    CANVAS_HEIGHT = user32.GetSystemMetrics(1)  # 画布的高
    CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X轴坐标
    CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y轴坐标
    IMAGE_ENLARGE = 11  # 放大比例
    HEART_COLOR = "#ff2121"  # 心的颜色,这个是中国红


    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))

        # 放大
        x *= shrink_ratio
        y *= shrink_ratio

        # 移到画布中央
        x += CANVAS_CENTER_X
        y += CANVAS_CENTER_Y

        return int(x), int(y)


    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)

        return x - dx, y - dy


    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


    def curve(p):
        """
        自定义曲线函数,调整跳动周期
        :param p: 参数
        :return: 正弦
        """

        # 可以尝试换其他的动态函数,达到更有力量的效果(贝塞尔?)
        return 2 * (2 * sin(4 * p)) / (2 * pi)


    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 = 1000

            self.generate_frame = generate_frame
            for frame in range(generate_frame):
                self.calc(frame)

        def build(self, number):
            # 爱心
            for _ in range(number):
                t = random.uniform(02 * 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))

        @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(-11)
            dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-11)

            return x - dx, y - dy

        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(02 * 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(-1414)
                    y += random.randint(-1414)
                    size = random.choice((122))
                    all_points.append((x, y, size))

            # 轮廓
            for x, y in self._points:
                x, y = self.calc_position(x, y, ratio)
                size = random.randint(13)
                all_points.append((x, y, size))

            # 内容
            for x, y in self._edge_diffusion_points:
                x, y = self.calc_position(x, y, ratio)
                size = random.randint(12)
                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(12)
                all_points.append((x, y, size))

            self.all_points[generate_frame] = all_points

        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=HEART_COLOR)


    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)


    if __name__ == '__main__':
        root = Tk()  # 一个Tk
        root.attributes('-fullscreen'True)  # 全屏
        root.attributes('-alpha'0.9)  # 透明度
        canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
        canvas.pack()
        heart = Heart()  # 心
        draw(root, canvas, heart)  # 开始画画~
        root.mainloop()
    • 1

    最终效果如下:

    alt

    虽然效果也不错,但是还是感觉HTML+CSS的方式更,大家觉得呢

    本文由 mdnice 多平台发布

  • 相关阅读:
    【源码课件+教程】看动画,学Python_Python精品课程_Python精选教程_Python入门_Python基础_零基础到精通,只需这一套课程
    upload-labs关卡9(基于win特性data流绕过)通关思路
    记一次Nginx代理Mysql服务的经历
    C语言 strxfrm()实例讲解
    React - Ant Design3.x版本安装使用,并按需引入和自定义主题
    DAY1-深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别
    解决高分屏DPI缩放PC端百度网盘界面模糊的问题
    数据库系统——复习相关习题
    Vue基础(干货+代码)
    线程池执行的用户任务抛出异常会怎样
  • 原文地址:https://blog.csdn.net/zhouwei_1989_/article/details/127839007