浅析爱心代码的绘制思路——python实现

这是一篇没有写完的博客,受限于本人的知识储备,尚不能窥得代码原作者精妙的代码设计逻辑。在以后的日子里,我也会继续学习和揣摩,如果有哪位小可爱或者大佬愿意与我讨论或不吝指点,欢迎在评论区指出,不胜感激!


前言

《点燃我,温暖你》这部电视剧,2022年11月3日起在优酷视频播出。我虽然没有看过这部剧,但是据说,最近很流行的“李珣同款爱心代码”就是出自这里。

同不同款我不知道,无所谓真伪。因为好奇它的实现过程,于是我也拿到了该款“爱心代码”,花了几天时间研究了一下,在这里写成博客,供大家参考和谈论。

代码分析

1、用tkinter创建画布

tkinter是python提供的标准图形用户界面库,可以比较方便地用来绘制一些简单的图形界面。tkinter中提供的画布(Canvas)控件,用来绘制图形和展示图片。

要在电脑上绘制一颗爱心,可以使用Canvas控件,在Canvas控件上进行图形的绘制。在程序入口初始化根窗体,然后实例化一个画布对象canvas并布局画布的位置,然后进入主循环。这样就创建好了一个画布,接下来,就可以在这个画布上进行绘制了。

from tkinter import *

CANVAS_HEIGHT = 480                 #全局定义画布的高
CANVAS_WIDTH = 640                  #全局定义画布的宽

if __name__ == "__main__":
    root = Tk()
    canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    root.mainloop()

2、用数学函数计算像素点坐标

绘制爱心的数学函数有很多,在mathworld上有文章介绍了许多爱心函数,感兴趣的同学一定要浏览一下。我们选用其中的一个爱心函数进行绘制。选用的函数是一个关于t的参数方程,t是弧度。(t在[0,2Π]时,该参数方程的图像为一个完整的爱心。)

定义一个函数heart_function(t),用来计算爱心函数点的坐标(x,y)。

由于使用到了三角函数,所以需要导入math标准库。math库中提供的数学函数,返回值绝大部分都是浮点数类型,而我们需要在画布上绘制这些点,对应的确是像素点的坐标,而像素点是整数类型。所以函数的返回值要将数学函数运算后返回的x,y的float类型强制转换为int类型,便于在画布上绘制。

同样地,我们计算出的x,y坐标只是一个点,而当要在画布上进行绘制时,我们使用矩形小方块勾勒爱心轮廓和粒子效果。矩形小方块是有面积的,显然一个点并不能表示二维图形。因此,还需要一个“放大因子”,能将我们计算出的坐标点进行适当地放大,让它在绘制的时候,拥有足够的空间对应生成出小矩形。

同样地,我们计算出的x,y坐标,是不可以直接对应在画布上的。因为画布的像素点,左上角为(0,0),右下角为画布的宽width,画布的长height,即(width,height)。也就是说,我们用函数计算出的坐标点,需要想办法把它“移动”到画布中央去,而不是部分显示在画布左上角。

from math import *

CANVAS_CENTER_X = CANVAS_WIDTH / 2          #全局定义画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2         #全局定义画布中心的Y轴坐标
IMAGE_ENLARGE = 11                          #全局定义放大因子

def heart_function(t):
    x = 16 * (sin(t) ** 3)
    y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
    x = x * IMAGE_ENLARGE                   #放大因子,放大x
    y = y * IMAGE_ENLARGE                   #放大因子,放大y
    x = x + CANVAS_CENTER_X                 #x移动到画布中央
    y = y + CANVAS_CENTER_Y                 #y移动到画布中央
    return int(x), int(y)

3、在画布上绘制像素点

至此,我们已经能够计算出要在画布上绘制的所有像素点,接下来就可以将这些像素点绘制在画布上进行显示了。 用一个for循环在画布上不断绘制矩形点,就能勾勒出爱心函数的图像。成功绘制出爱心。

import random

HEART_COLOR = "pink"

def Draw():
    for i in range(1000):
        t = random.uniform(0, 2 * pi)
        x,y = heart_function(t)
        size = random.choice((1,2,3))
        canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=HEART_COLOR)

后记

待续……

参考资料

爱心函数: Heart Curve -- from Wolfram MathWorld

代码出处:Yep | 李洵爱心代码 python、html+CSS+JavaScript实现_西皮呦的博客-CSDN博客

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下雪就该搓雪球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值