3D绘制爱心(python)

图像绘制代码

import time
import numpy as np
import matplotlib.pyplot as plt


class Guess:
    def __init__(self, bbox=(-1.5, 1.5), resolution=50, lines=20, scale=1.2) -> None:
        """
               bbox: 控制画格的大小
               resolution: 控制爱心的分辨率
               lines: 控制等高线的数量
                scale: 心脏缩放的系数
               """
        self.xmin, self.xmax, self.ymin, self.ymax, self.zmin, self.zmax = bbox * 3
        plt.ion()# 开启画布动态模式
        self.scale = scale
        # scale: 心脏缩放的系数 设置为全局变量
        self.time = time.time()
        A = np.linspace(self.xmin, self.xmax, resolution)
        self.B = np.linspace(self.xmin, self.xmax, lines)
        self.A1, self.A2 = np.meshgrid(A, A)

    def coordinate(self, x, y, z):
        return (x ** 2 + (9 / 4) * y ** 2 + z ** 2 - 1) ** 3 - x ** 2 * z ** 3 - (9 / 80) * y ** 2 * z ** 3

    def draw(self, ax, coef):
        # coef: 使得心脏可以按照时间跳动
        for z in self.B:
            X, Y = self.A1, self.A2
            Z = self.coordinate(X, Y, z) + z
            cset = ax.contour(X * coef, Y * coef, Z * coef, [z * coef], zdir='z', colors=('pink',))

        for y in self.B:
            X, Z = self.A1, self.A2
            Y = self.coordinate(X, y, Z) + y
            cset = ax.contour(X * coef, Y * coef, Z * coef, [y * coef], zdir='y', colors=('pink',))

        for x in self.B:
            Y, Z = self.A1, self.A2
            X = self.coordinate(x, Y, Z) + x
            cset = ax.contour(X * coef, Y * coef, Z * coef, [x * coef], zdir='x', colors=('pink',))

    def run(self, count):
        #加入count是我们想循环的次数
        fig = plt.figure()
        for i in range(count):
            plt.clf()# 每次清除画布
            ax = fig.add_subplot(projection='3d')
            ax.set_title("2luyao")
            ax.set_zlim3d(self.zmin, self.zmax)
            ax.set_xlim3d(self.xmin, self.xmax)
            ax.set_ylim3d(self.ymin, self.ymax)
            times = time.time() - self.time    # 计算画布的当前时间状态
            ax.view_init(10, 100 + np.cos(times) * 10)# 让三维坐标图可以变换坐标展示
            # coef 是用来放缩心脏的大小的,加入cos来使它有节奏的跳动
            coef = np.cos(times) * (self.scale - 1) + 1
            self.draw(ax, coef)
            plt.pause(0.1)  # 让绘制出来的心脏可以显示
            plt.show()


if __name__ == '__main__':
    demo = Guess()
    demo.run(50)

结果显示

在这里插入图片描述
这是一个动态的爱心,可以试验一下

参考

https://blog.youkuaiyun.com/qq_44961028/article/details/127778513

### 使用 Python 实现 3D 粒子效果心形图形 要实现一个具有粒子效果的 3D 心形图形,可以通过 `matplotlib` 和其他库完成。以下是详细的说明和代码示例。 #### 安装必要的依赖项 为了运行此代码,需要安装以下依赖项: ```bash pip install matplotlib numpy pygame ``` [^1] #### 绘制 3D 爱心的核心原理 绘制 3D 爱心通常基于参数方程定义其形状,并通过调整颜色、透明度以及动态变化模拟粒子效果。具体来说,可以使用 NumPy 来计算坐标点,而 Matplotlib 的 `Axes3D` 则用于渲染图像。 --- #### 示例代码3D 粒子爱心 下面是一个完整的代码示例,展示了如何使用 `matplotlib` 创建带有粒子效果的 3D 爱心: ```python import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt def heart_3d(t): """ 参数化表示 3D 爱心函数。 输入 t 是角度变量数组 (radians),返回对应的 x, y, z 坐标。 """ x = 16 * np.sin(t)**3 y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t) z = np.sin(t) * abs(np.sin(t)) ** 0.3 # 添加 Z 轴维度 return x, y, z # 设置绘图范围 t = np.linspace(0, 2 * np.pi, 1000) # 计算 X,Y,Z 坐标 x, y, z = heart_3d(t) # 初始化 3D 图像对象 fig = plt.figure(figsize=(8, 6)) ax = fig.add_subplot(111, projection='3d') # 绘制线框 ax.plot(x, y, z, color="red", linewidth=2) # 添加随机分布的粒子效果 num_particles = 500 random_t = np.random.uniform(low=0, high=2*np.pi, size=num_particles) particle_x, particle_y, particle_z = heart_3d(random_t) # 散点图显示粒子 ax.scatter(particle_x, particle_y, particle_z, c=np.abs(z), cmap='Reds', s=10) # 配置视图 ax.set_axis_off() # 关闭坐标轴 plt.title("3D Heart with Particle Effect") # 显示图像 plt.show() ``` [^3] --- #### 动态效果扩展 如果希望进一步增强视觉体验,还可以引入动画功能。例如,让爱心随时间脉动或旋转。这可通过 `FuncAnimation` 类实现。 ##### 动画版本代码片段 以下代码实现了心跳效果(即大小周期性变化): ```python from matplotlib.animation import FuncAnimation def update(frame): scale_factor = 1 + 0.1 * np.sin(frame / 10) # 控制缩放比例 ax.clear() # 更新线条数据 scaled_x, scaled_y, scaled_z = scale_factor * x, scale_factor * y, scale_factor * z ax.plot(scaled_x, scaled_y, scaled_z, color="red", linewidth=2) # 更新散点数据 random_t = np.random.uniform(low=0, high=2*np.pi, size=num_particles) particle_x, particle_y, particle_z = heart_3d(random_t) ax.scatter( scale_factor * particle_x, scale_factor * particle_y, scale_factor * particle_z, c=np.abs(scale_factor * particle_z), cmap='Reds', s=10 ) ax.set_axis_off() ani = FuncAnimation(fig, update, frames=range(200), interval=50) plt.show() ``` --- #### 总结 上述代码分别提供了静态和动态两种方式来创建 3D 粒子爱心的效果。其中,核心部分在于利用参数方程生成爱心中各点的位置,再借助 `matplotlib` 渲染成三维模型并添加粒子点缀。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dream_Bri

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

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

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

打赏作者

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

抵扣说明:

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

余额充值