Python爱心代码

2023-11-07

 效果展示

 代码自取

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爱心代码 的相关文章

随机推荐

  • DCMTK读取dcm图片+opencv显示图片

    读取DCM格式图片中的一些基本信息 DcmFileFormat是最基本的文件对象 OFCondition是每一次操作的返回值 用来判断操作是否成功 所有的数据都存在DcmDataSet对象中 用getDataSet方法得到 void Loa
  • webpack(4版本)使用

    webpack简介 webpack 是一种前端资源构建工具 一个静态模块打包器 module bundler 在 webpack 看来 前 端的所有资源文件 js json css img less 都会作为模块处理 它将根据模块的依赖关系
  • 利用神经网络实现股票预测

    神经网络 NeuralNetworks 是一种用训练数据拟合目标函数的黑箱模型 只要数据量足够大 它可以拟合出输入到输出之间的任意函数关系 本篇教程我们将使用神经网络进行股市的预测 利用数据样本学习 得到相关因素预测股票走势 01 问题描述
  • 区块链+跨境支付有哪些优势?

    全球互联网的高速发展也带动了跨境电商的快速发展 跨境支付也瞬间成为第三方支付领域的一个风口 而将区块链技术应用在跨境支付领域也逐渐成为市场的热点需求 传统的跨境支付方式中间环节繁杂 费时又费力 而且跨境电商卖家在跨境支付环节 存在境外银行账
  • ModuleNotFoundError: No module named ‘fused_layer_norm_cuda‘

    No module named fused layer norm cuda Issue 161 NVIDIA apex GitHub 按照以下方式安装 可解决问题 apex 安装步骤 1 git clone https github com
  • android和iOS平台的崩溃捕获和收集

    通过崩溃捕获和收集 可以收集到已发布应用 游戏 的异常 以便开发人员发现和修改bug 对于提高软件质量有着极大的帮助 本文介绍了iOS和android平台下崩溃捕获和收集的原理及步骤 不过如果是个人开发应用或者没有特殊限制的话 就不用往下看
  • pycharm preparing workspace 项目打不开怎么办?

    屏幕一直显示 preparing workspace 无法打开项目时 找出保存最近项目信息的xml文件 Library Preferences Pycharm2019 2 options recentProjectsDirectories
  • Unity3D下如何采集camera场景数据并推送RTMP服务?

    Unity3D使用场景 Unity3D是非常流行的游戏开发引擎 可以创建各种类型的3D和2D游戏或其他互动应用程序 常见使用场景如下 游戏开发 Unity3D是一个广泛用于游戏开发的环境 适用于创建各种类型的游戏 包括动作游戏 角色扮演游戏
  • vue2.0+ 使用v-model 及报错解决办法;

    div div
  • 【WSL】使用WSL在Windows上安装Linux(Ubuntu20.04)

    文章目录 WSL 使用WSL在Windows上安装Linux Ubuntu20 04 一 环境说明 二 开启WSL功能 三 安装Linux子系统 四 升级内核 五 安装完成 六 Windows家庭版Hyper V功能开启 WSL 使用WSL
  • 通过SQL 语句删除重复记录并且只保留一条记录

    这里写自定义目录标题 1 重复字段 2 查询全部重复的数据 3 删除全部重复试题 4 查询表中多余重复试题 根据 depno 来判断 除了 rowid 最小的一个 4 1 第一种方法 4 2 第二种方法 4 3 第三种方法 5 删除表中多余
  • 同步IO、异步IO、阻塞IO、非阻塞IO、复用IO

    参考 同步IO 异步IO 作者 今天天气眞好 发布时间 2021 04 19 09 42 29 网址 https blog csdn net qq 51118175 article details 115857196 spm 1001 20
  • 讯为IMX6ULL-QT系统移植之busybox构建根文件系统

    一 BusyBox 工具下载 BusyBox 工具我们可以在其官网下载到 官网地址为 https busybox net 然后点击官网左侧 Get BusyBox 栏中的 Download Source 进入下载页面即可 先介绍等下要使用的
  • 硅谷悄然而起的流行:在管理上干掉CEO!

    本文系 Medium 于 2015 年 5 月 27 日举办的一次论坛活动回顾 在该活动上 员工嘉宾 Daryl Koopersmith 和 Jean Hsu 进行了关于 无差异自治 Holacracy 工作方式的分享演讲 关于Holacr
  • docker部署springboot,并且查看运行日志

    docker部署springboot 默认已经安装好docker 第一步 构建镜像 创建Dockerfile文件 文件内容如下 FROM frolvlad alpine oraclejdk8 slim VOLUME tmp ADD inde
  • 静态代码块、动态代码块、构造方法的优先级

    执行优先级 静态代码块 gt 动态代码块 gt 构造方法 代码案例 特殊情况 静态变量赋值new public class Main2 Main2 System out println hello world private static
  • 【算法】模拟,高精度

    高精度加法 P1601 A B Problem 高精 洛谷 计算机科学教育新生态 luogu com cn 思路就是模拟 值得注意的就是要用字符串类型输入 存进自己的int数组时要倒着存 因为如果是正着存的话 进位会有点trouble 时间
  • 机器学习:隐马尔可夫模型(HMM)

    后续会回来补充代码 1 隐马尔可夫模型 隐马尔可夫模型 Hidden Markov Model HMM 是可用于标注问题的统计学模型 描述由隐藏的马尔可夫链随机生成观测序列的过程 1 1 数学定义 隐马尔可夫模型是关于时序的概率模型 描述由
  • How to Connect Power Switches

    原文链接 https vlsiconceptsforyou blogspot com 2020 05 how to connect power switches html Wednesday May 20 2020 How to Conne
  • Python爱心代码

    效果展示 代码自取 from tkinter import from math import log sin cos pi import random 新建画布尺寸大小 CANVAS WIDTH 640 CANVAS HEIGHT 480