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