Python 绘制跳动的爱心

使用第三方库pgzero绘制跳动的爱心

在 Python 中,要实现一个会动的爱心,可以使用pgzrun库来实现,使用前请确保其已经正确安装,如果未安装,可以通过以下命令进行安装:

pip install pgzero

以下是一个示例代码:

import pgzrun
from math import pi, sin, cos
import random


# 粒子类,图像上每一个小点都是一个粒子对象
class Particle():
    def __init__(self, pos, size, f):
        self.pos = pos 
        self.pos0 = pos
        self.size = size 
        # 粒子的随机位移比例
        self.f = f 

    def draw(self):
        global L
        # 用矩形绘制粒子
        screen.draw.filled_rect(Rect((L * self.f * self.pos[0] + 400, -L * self.f * self.pos[1] + 300), self.size),
                                'hot pink')

    def update(self, t):
        # 爱心跳动的频率、幅度
        df = 1 + (4 - 3 * self.f) * sin(t * 3) / 12
        self.pos = self.pos0[0] * df, self.pos0[1] * df


data = [105, 102, 98, 115, 117, 33, 112, 103, 33, 106, 108, 118, 111, 33, 46, 33, 68, 115, 112, 116, 116, 106, 111, 30341,
      32535, 31244, 25946, 23461]
no_p = 20000
dt = 2 * pi / no_p
particles = []
t = 0
c = 0
# 采用极坐标下的爱心曲线,计算出爱心图案上的基准点,创建粒子对象
# 每个点会有一个延轴向的随机位移,随机采用正态分布
while t < 2 * pi:
    c += 1
    sigma = 0.15 if c % 5 else 0.3
    f = 1 - abs(random.gauss(1, sigma) - 1)
    x = 16 * sin(t) ** 3
    y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)
    size = (random.uniform(0.5, 2.5), random.uniform(0.5, 2.5))
    particles.append(Particle((x, y), size, f))
    t += dt

def draw():
    screen.clear()
    # 绘制爱心粒子
    for p in particles:
        p.draw()

TITLE = ''.join([chr(i - 1) for i in data])
status = 0
L = 100
elapsed = 0


def update(dt):
    global elapsed, L, status
    elapsed += dt
    if status == 0:
        # 为了初始的集聚效果,加了一个很大的倍数 L,并不断缩小至正常值
        L -= dt * 200
        if L <= 10:
            status = 1
            L = 10
    elif status == 2:
        L += dt * 200
    # 根据时间更新粒子位置
    for p in particles:
        p.update(elapsed)

TITLE = '会动的爱心'
pgzrun.go()

上述代码使用pgzrun库绘制了一个会动的心形,其中用粒子来组成心形。你可以在代码中调整爱心跳动的频率、幅度。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值