python简单的画图代码爱心,python编程画爱心代码

本文介绍了如何使用Python的Tkinter库结合数学函数绘制一个动态变化的心形图案,包括心形函数定义、点的生成与扰动以及动画效果的实现。
部署运行你感兴趣的模型镜像

大家好,小编来为大家解答以下问题,python画爱心的代码怎么运行,python简单的画图代码爱心,现在让我们一起来看看吧!

效果图:



源码:

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

您可能感兴趣的与本文相关的镜像

LobeChat

LobeChat

AI应用

LobeChat 是一个开源、高性能的聊天机器人框架。支持语音合成、多模态和可扩展插件系统。支持一键式免费部署私人ChatGPT/LLM 网络应用程序。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值