首页 > 编程语言 >python 爱心代码

python 爱心代码

时间:2024-10-23 15:11:38浏览次数:1  
标签:CANVAS ratio python 代码 random 爱心 points frame self

今天看到一段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
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2
IMAGE_ENLARGE = 11

设置颜色

HEART_COLOR = "#FF99CC"

def center_window(root, width, height):
screenwidth = root.winfo_screenwidth() # 获取显示屏宽度

screenheight = root.winfo_screenheight()  # 获取显示屏高度

size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) /

                        2, (screenheight - height) / 2)  # 设置窗口居中参数

root.geometry(size)  # 让窗口居中显示

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 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(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.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(-14, 14)

            y += random.randint(-14, 14)

            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._edge_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

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

root.title("爱心")

center_window(root, CANVAS_WIDTH, CANVAS_HEIGHT)  # 窗口居中显示

canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)

canvas.pack()

heart = Heart()

draw(root, canvas, heart)

Label(root, text="I love you", bg="black", fg="#FF99CC", font="Helvetic 20 bold").place(

    relx=.5, rely=.5, anchor=CENTER)

root.mainloop()

标签:CANVAS,ratio,python,代码,random,爱心,points,frame,self
From: https://www.cnblogs.com/zlibrary/p/18496445

相关文章

  • 使用Python ftplib库进行封装FTP自动下载
    fromftplibimportFTPfrombaseapi.loggerimportMyLoggerlogger=MyLogger.get_logger()classFTPUtils:ftp=FTP()ftp.set_pasv(False)def__init__(self,username,password,host,port=21):"""用于FTP站点初始化......
  • Python爬虫:API接口数据的“美食侦探”
    亲爱的代码美食家们,今天咱们不聊那些让人头秃的bug,也不谈那些让人眼花的架构图。咱们来聊聊那些在代码世界里寻找美食的“美食侦探”——Python爬虫。Python爬虫:API接口数据的“美食侦探”想象一下,你在代码的世界里,遇到了一个充满美食的餐厅——一个提供丰富数据的API接口。......
  • 基于Django+Python的宾馆管理系统设计与实现
    项目运行需要先安装Python的相关依赖:pymysql,Django==3.2.8,pillow使用pipinstall安装第一步:创建数据库第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句第三步:修改源代码中的settings.py文件,改成自己的mysql数据库用户名和密码第四步:运行命令:pythonmanage.pyrunser......
  • Python的京东探险记:揭秘商品详情的快速通道
    在一个充满无限可能的数字世界里,Python,这位编程界的多面手,正准备踏上一场刺激的探险之旅:快速获取京东商品的详情数据。这不仅是一次技术的挑战,更是一次与时间赛跑的较量。!Python先生,这位机智的代码探险家,打开了他的笔记本电脑,准备开始这场冒险。他知道,要快速获取京东的商品详情......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录二叉树理论基础学习二叉树有两种主要的形式:满二叉树和完全二叉树。满二叉树:只有度为0的结点和度为2的结点,且度为0的结点在同一层的二叉树。深度为k,有2^k-1个节点。完全二叉树:除了最......
  • 22年计挑赛Python组区域赛个人解答
    第一题:代码部分:生产问题A=100;B=150;List=[]a,b,c,d,e,f,g,h,i=map(int,input().split())list=[a,b,c,d,e,f,g,h,i]forminrange(min(g//a,h//b,i//c)+1):n=min((g-m*a)//e,(h-m*b)//f,(i-m*c)//f)w=A*m+B*nList.append(w);List.append(m);......
  • 【python学习记录篇】08.for、while、break、continue,在python里的使用比在英语阅读理
    小白学习纪实,跨专业学python的第八天~睡了一觉起来觉得自己又行了~   8.1循环    很多情况下,我们会比较讨厌重复着做着相同的事情,因为这样枯燥乏味。很直接的,在我们睡不着失眠的时候,我们会选择重复数绵羊加速我们睡眠。对于程序员来讲同样不喜欢重复地做......
  • 【python学习记录篇】09.Python函数进阶,上难度了上难度了
    小白学习纪实,跨专业学python的第九天~没想到python也要学函数......真是干的漂亮......    9.1函数    9.1.1函数的意义    在生活中,试想一下我们用手洗衣服的时候,我们需要接水,放入脏衣服,放入洗衣液,然后一件件用手搓,每次洗衣服的时候都要这样干,很......
  • Python脚本,它将遍历指定目录下的所有.srt文件,移除其中的不必要的英文字符、不必要的空
    Python脚本,它将遍历指定目录下的所有.srt文件,移除其中的不必要的英文字符、不必要的空行以及不必要的空格。该脚本会保留字幕索引、字幕时间线以及字幕中的中文内容,并且只保留字幕中的中文内容。它还会保留字幕行与字幕之间的换行符,同时去掉字幕与字幕之间的不必要的换行符。处理......
  • 代码随想录-环形链表II
    题目与解析    题目链接:环形链表II本题两个关键点,1、确定有环2、确定环的入口位置 提供两种解法,第一种是我借助了一个辅助的列表来记录指针,空间复杂度O(n)比较无脑 第二种是Carl哥的双指针法,又是套圈问题,虽然很难想,但还是推荐这种方式,这才是算法解法一:publ......