效果图:

源码:

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

# 新建画布尺寸大小
CANVAS_WIDTH = 640
CANVAS_HEIGHT = 480
CANVAS_CENTER_X = CANVAS_WIDTH / 2
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2
IMAGE_ENLARGE = 8

# 定义心形函数
def heart_function(t):
    x = 16 * sin(t) ** 3
    y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))

y *= IMAGE_ENLARGE
    x *= IMAGE_ENLARGE

x += CANVAS_CENTER_X
    y += CANVAS_CENTER_Y

return int(x), int(y)

def scatter_inside(x, y, beta=0.15):
    ratiox = - beta * log(random.random())
    ratioy = - beta * log(random.random())
    dx = ratiox * (x - CANVAS_CENTER_X)
    dy = ratioy * (y - CANVAS_CENTER_Y)
    return x - dx, y - dy

# 定义扰动函数

def shrink(x, y, ratio):
    force = 1 / ((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.5
    dx = ratio * force * (x - CANVAS_CENTER_X)
    dy = ratio * force * (y - CANVAS_CENTER_Y)
    return x - dx, y - dy

# 定义画心函数
class Heart:
    # 定义self
    def __init__(self):
        self._points = set()
        self._extra_points = set()
        self._inside = set()
        self.all_points = {}
        self.calc_position = shrink
        self.build(2000)

# 创建心形点
    def build(self, number):
        for _ in range(number):
            t = random.uniform(0, 2 * pi)
            x, y = heart_function(t)
            self._points.add((int(x), int(y)))

for xx, yy in list(self._points):
            for _ in range(3):
                x, y = scatter_inside(xx, yy, 0.05)
                self._extra_points.add((x, y))

# inside点
        point_list = list(self._points)
        for _ in range(4000):
            x, y = random.choice(point_list)
            x, y = scatter_inside(x, y)
            self._inside.add((int(x), int(y)))

# 计算心形点
    def calc_position(self, x, y, ratio):
        force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.5)
        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

def calc(self, frame):
        calc_position = self.calc_position
        ratio = 10 * sin(frame / 10 * pi)

all_points = []

# outline 心形点
        for x, y in self._points:
            x, y = calc_position(x, y, ratio)
            size = random.randint(1, 3)
            all_points.append((x, y, size))

# inner内圈点
        for x, y in self._extra_points:
            x, y = calc_position(x, y, ratio)
            size = random.randint(1, 2)
            all_points.append((x, y, size))

for x, y in self._inside:
            x, y = calc_position(x, y, ratio)
            size = random.randint(1, 2)
            all_points.append((x, y, size))

self.all_points[frame] = all_points

# 画出心形点

def render(self, canvas, frame):
        for x, y, size in self.all_points[frame % 20]:
            canvas.create_rectangle(
                x, y, x + size, y + size, width=0, fill="#ff7171")

# 定义动画函数

def draw(root: Tk, canvas: Canvas, heart: Heart, frame=0):
    canvas.delete('all')

# heart.render(canvas)
    heart.render(canvas, frame)
    root.after(30, draw, root, canvas, heart, frame + 1)

# 主程序调用所有函数
if __name__ == '__main__':
    root = Tk()
    canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    # 创建字体

canvas.pack()

heart = Heart()
    for frame in range(20):
        heart.calc(frame)

draw(root, canvas, heart)
    root.mainloop()

PYTHON爱心代码相关推荐

  1. python爱心代码简单教程

    python爱心代码简单教程操作方法 1 将以上代码保存为.py文件,假设保存的文件名为 love.py (不会保存?先保存为txt文本,然后将后缀改为.py) 2 在终端(cmd命令窗口)输入pyt ...

  2. python爱心代码合集

    python爱心代码合集 一行代码画爱心 输出 I 爱 U 填充型 动态画红心 桃心 线性 立体红心 画一朵玫瑰花 画树 附录 一行代码画爱心 print('\n'.join([''.join([(' ...

  3. 解析python爱心代码(码农高天版)

    背景概述 自从看了码农高天的python爱心代码就非常震撼,特别想了解其背后的实现原理,感觉是自己的知识不够,于是这股冲动带我刷了计算图形学,高数,线性,数值分析以及信号处理,最后发现然而并没什么用, ...

  4. Python爱心代码(双版本)

    Python爱心代码双版本: 版本1:原版动态爱心: 版本2:中间加名字版 原版代码: #python李峋爱心代码 #br七鹤 import random from math import cos, ...

  5. python 爱心代码

    python程序代码:heart.py from math import cos, pi import numpy as np import cv2 import os, globclass Hear ...

  6. 【爱心上面可以加字】Python爱心代码,简单又好看

    目录 前言 一.爱心代码展示 二.完整代码 前言 最近都快要被动态爱心刷屏了,今天跟大家带来不一样的爱心代码,可以在爱心中央写下你想要的字! 可以用Python来实现它,会Python的朋友们赶快收藏 ...

  7. python爱心代码_母亲节快到了,用Python给老妈写个祝福小程序吧~

    导 语 看到好多人留言问我咋好久没更新文章了,于是看了下上篇文章的发布日期,好吧确实挺久的,是该上线更一波文章了.想到母亲节快到了,不如就用Python给老妈写个祝福小程序吧~让我们愉快地开始吧~ 相 ...

  8. python爱心代码_「含蓄优雅表白神器」程序员式用python代码画爱心(附详细教程)...

    还能用python代码画爱心?还有这种操作?这是什么原理? 不相信python代码可以画爱心?先来一张效果图来看看效果吧! 用python代码画爱心的思路是怎样的? 1.怎么画心形曲线 2.怎么填满心 ...

  9. python爱心代码制作_Python之——爱心代码参与情人节

    一行代码实现输出爱心图,参考https://zhuanlan.zhihu.com/p/23321351 原理: 1.借助数学函数--((x * 0.05) ** 2 + (y * 0.1) ** 2 ...

  10. python爱心代码动态_一篇文章教你用python画动态爱心表白

    hRf免费资源网 初级画心hRf免费资源网 学Python,感觉你们的都好复杂,那我来个简单的,我是直接把心形看作是一个正方形+两个半圆:hRf免费资源网 hRf免费资源网 于是这就很简单了,十行代码 ...

最新文章

  1. JDK中的坑:JDK中这些方法的bug你不要踩
  2. 如何在到处是“雷”的系统中「明哲保身」?这是第一招
  3. Python文件修改的两种方式
  4. 1079. 延迟的回文数 (20)
  5. 从零开始学Pytorch(十三)之梯度下降
  6. mysql可以装到其他端口吗_linux下怎么在另一个端口安装高版本mysql
  7. 让Oracle跑得更快 ——博文视点大讲堂34期活动圆满结束
  8. 此时本机的BootLoader程序坏了,也就是说grub第一阶段坏掉了,该如何修复
  9. 利润百倍的暴利行业?
  10. flash游戏转换html5,一键转换——介绍我做的flash转html5工具LavaH
  11. 推荐一个小工具 -- 微信QQ防撤回
  12. 【业务人员第一视角】氚云低代码开发平台测评
  13. HTML 编辑器-网页制作是用什么来做的?-2
  14. javascript 简繁转换
  15. Python dic 方法汇总
  16. 基于K210的MNIST手写数字识别
  17. Minecraft空岛服开服
  18. 怎样让你的软文更有说服力?四个办法帮你赢得用户信任
  19. 计算机管理器磁盘清理,Win10提示windows磁盘空间清理管理器已停止工作
  20. 什么是LTV,舔狗的LTV可以乘以N吗?

热门文章

  1. 【测控电路】包络检波电路
  2. 记一次tomcat漏洞修复补丁升级
  3. SVN + 坚果云实现多台设备同步
  4. 将XML文件中的内容批量修改
  5. Linux qt shell脚本,QT执行shell脚本或者执行linux指令
  6. 计算机科学导论与前沿,计算机科学导论(英中双语版)
  7. 工字型钢弹性截面模量计算公式_截面模量的计算公式是什么?
  8. 跨境电商系统_商城自营系统_自营店铺系统_功能业务逻辑_OctShop免费开源商城系统
  9. 机房收费系统 可行性分析报告
  10. vue实现雪花飘落特效