Python画图之动态爱心

news2024/11/24 17:43:36

Python画出动态爱心(有趣小游戏)

  • 一、效果图
  • 二、Python代码

一、效果图

请添加图片描述

二、Python代码


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

CANVAS_WIDTH = 640  # 画布的宽
CANVAS_HEIGHT = 480  # 画布的高
CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y轴坐标
IMAGE_ENLARGE = 11  # 放大比例
HEART_COLOR = "pink"  # 心的颜色

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

CANVAS_WIDTH = 640  # 画布的宽
CANVAS_HEIGHT = 480  # 画布的高
CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y轴坐标
IMAGE_ENLARGE = 11  # 放大比例
HEART_COLOR = "pink"  # 心的颜色


def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
    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):
    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):
    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):
    return 4 * (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(0, 2 * 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(-1, 1)
        dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)

        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(0, 2 * pi)
            x, y = heart_function(t, shrink_ratio=11)
            x, y = shrink(x, y, halo_radius)
            if (x, y) not in heart_halo_point:
                heart_halo_point.add((x, y))
                x += random.randint(-11, 11)
                y += random.randint(-11, 11)
                size = random.choice((1, 2, 2))
                all_points.append((x, y, size))

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

        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

    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()
    canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    heart = Heart()
    draw(root, canvas, heart)
    root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1161689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CoCa论文笔记

摘要 计算机视觉任务中,探索大规模预训练基础模型具有重要意义,因为这些模型可以可以极快地迁移到下游任务中。本文提出的CoCa(Contrastive Captioner),一个极简设计,结合对比损失和captioning损失预训练一…

Spring中的核心概念

🎈个人公众号:🎈 :✨✨✨ 可为编程✨ 🍟🍟 🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵 🍉本篇简介:🍉 本篇记录Spring中的核心概念,如有出入还…

QQ文件怎么恢复?3个方法解决文件丢失问题!

无论是在学习还是工作中,我们都有可能需要接触到QQ这款软件。QQ传输文件十分方便,因此仍然有许多小伙伴喜欢用QQ来发送各种类型的文件。对于大家来说,最害怕的莫过于重要的文件出现丢失的情况。 当我们发现QQ文件意外删除或者过期时该怎么办…

【第28例】IPD体系进阶 | 需求管理:需求实现过程

目录 简介 内容详解 CSDN学院相关推荐 作者简介 简介 继续 IPD 体系中的需求管理相关的专题。 先来看看整个需求管理涉及的过程内容: 需求管理流程主要包含五个阶段: 需求收集; 需求分析; 需求分发/分配;

软件开发项目文档系列之九如何撰写测试方案

测试方案是任何软件开发和项目实施过程中的重要组成部分,它提供了确保系统质量和可靠性的蓝图。通过明确定义测试的范围、策略、资源和计划,测试方案确保项目团队明白如何有效地执行测试,并提供客观的评估和反馈。它有助于降低项目风险&#…

【PyTorch 卷积】实战自定义的图片归类

前言 卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一,它通过卷积层、池化层、全连接层等结构,可以有效地处理如时间序列和图片数据等。关于卷积的概念网络上也比较多,这里就不一一描述了。…

苹果手机黑屏了怎么恢复正常?这些修复方法记得收藏好!

苹果手机黑屏是一种常见的手机故障,很多人在遇到手机突然黑屏的情况时感到束手无策。手机黑屏会干扰用户的正常使用,带来不便,并给用户带来不好的体验。苹果手机黑屏了怎么恢复正常?本文将为大家详细介绍修复苹果手机黑屏的方法。…

3.网络之UDP

UDP协议 文章目录 UDP协议1. UDP概述2. UDP报文格式3. UDP传输限制4. UDP校验和4.1 CRC 循环冗余校验算法4.2 md5 校验算法 1. UDP概述 UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证&a…

Linux指令【下】

目录 时间 date 时间戳 cal 查找 find which whereis grep uniq 打包压缩 zip/unzip tar uname 其他热键 关机 系统互传 linux和Windows Linux和Linux 时间 date 用法:date[option] [format] 选项功能%Y年%d日%m月%H时%M分%s秒%X%H:%M%S%F%Y-%…

「Java开发指南」如何用MyEclipse搭建Spring MVC应用程序?(一)

本教程将指导开发者如何生成一个可运行的Spring MVC客户应用程序,该应用程序实现域模型的CRUD应用程序模式。在本教程中,您将学习如何: 从数据库表的Scaffold到现有项目部署搭建的应用程序 使用Spring MVC搭建需要MyEclipse Spring或Bling授…

【MySQL数据库】 一

本文主要介绍了关系型数据库和非关系数据库的区别,以及主流的关系型数据库mysql的安装 , 以及mysql数据库客户端-服务器的结构. 一.数据库的分类 我们可以简单的把数据库看成是一类软件 数据库分成两大类 1.关系型数据库 通常以表格的方式来组织 2.非关系型数据库 通常以键值…

电脑关机很慢?这几个优化技巧请收好!

当我们使用电脑时,一个令人不快的问题是,关机变得异常缓慢。电脑在关机时可能需要很长时间,甚至让人感到沮丧。这不仅是时间浪费,还可能表明系统存在问题。在本文中,我们将介绍四种解决电脑关机很慢的方法,…

怎么向国外客户催单?这样做既有效又不让客户反感

外贸业务员接单的过程其实是一场利益博弈的过程,而且外贸销售永远靠结果说话,所以无论你的客户如何承诺,甚至有时候都已经签订了定单合同做了PI,但客户钱没到账公司,一切就有可能归零。 01 心态一定要稳住 对于每个有…

如何在业务代码中优雅地使用责任链模式

通过使用责任链模式,我们可以更加灵活和优雅地处理请求,降低代码之间的耦合度,提高代码的可维护性和可扩展性。在一些具有复杂业务逻辑或需要动态处理请求的场景下,使用责任链模式将是一个很好的选择。本文将通过一个具体的示例来…

【错误解决方案】ModuleNotFoundError: No module named ‘tensorboardX‘

1. 错误提示 在python程序中,尝试导入一个名为tensorboardX的模块,但Python提示找不到这个模块。 错误提示:ModuleNotFoundError: No module named ‘tensorboardX‘ 2. 解决方案 在python出现中,遇到这个问题是Python无法找到…

无需编程技术,快速搭建个人网站

如果你想拥有一个属于自己的个人网站,但又没有任何编程经验,别担心,我们今天将为你介绍一个简单的方法,让你轻松搭建网站,无需任何编程知识。让我们一起来看看吧! 在乔拓云建站工具中,自带了许多…

TypeScript之装饰器

一、是什么 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上 是一种在不改变原类和使用继承的情况下,动态地扩展对象功能 同样的,本质也不是什么高大上的结构,就…

图纸管理制度《八》设计图纸管理制度

第一章 总则 第1条 目的。为做好设计图纸的管理工作,使其收发及时、手续齐全、废图绝迹、不遗失、无差错,特制定本办法。 第2条 适用范围。本办法适用于企业所有工程项目的图纸管理工作。 第3条 相关部门及人员职责 (1) 工程技术部负责图纸管理的监督…

双十一百亿美元补贴,AWS阿里云腾讯云华为云国际版钜惠

双十一来袭!阿里云/腾讯云/华为云国际站该怎么玩?九河云(双十一特大促销,低至5.18折 (9he.com))这次双十一活动汇聚了一系列前所未有的优惠,不仅能享受服务器和CDN的超值折扣,还有机会赢取华为M…

智慧工地建造平台源码、智慧化工地云平台源码

概述:智慧工地管理平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实…