基于Python绘制3D立体爱心图案的示例详解

 更新时间:2022年11月11日 10:51:13   作者:弦masamasa  
这篇文章主要为大家详细介绍了利用Python实现绘制3D立体爱心图案的四种不同方法,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下

原理

1.使用python中的mtplotlib库。

2.立体爱心面公式

点画法(实心)

代码

import matplotlib.pyplot as plt #导入绘图模块
from mpl_toolkits.mplot3d import Axes3D #3d绘图模块
import numpy as np #导入数值计算拓展模块

#start generating points
x_lim=np.linspace(-10,10,150)
y_lim=np.linspace(-10,10,150)
z_lim=np.linspace(-10,10,150)
X_points=[] #用来存放绘图点X坐标
Y_points=[] #用来存放绘图点Y坐标
Z_points=[] #用来存放绘图点Z坐标
for x in x_lim:
    for y in y_lim:
        for z in z_lim:
            if (x**2+(9/4)*y**2+z**2-1)**3-(9/80)*y**2*z**3-x**2*z**3<=0:
                X_points.append(x)
                Y_points.append(y)
                Z_points.append(z)

plt.style.use('seaborn')
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d') 
ax.scatter(X_points,Y_points,Z_points,color="red") 
plt.show()

运行效果

这个画法侧面看起来很无语。

点画法(空心)

代码

import matplotlib.pyplot as plt #导入绘图模块
from mpl_toolkits.mplot3d import Axes3D #3d绘图模块
import numpy as np #导入数值计算拓展模块

#start generating points
x_lim=np.linspace(-10,10,200)
y_lim=np.linspace(-10,10,200)
z_lim=np.linspace(-10,10,200)
X_points=[] #用来存放绘图点X坐标
Y_points=[] #用来存放绘图点Y坐标
Z_tmp=[]
Z_points=[] #用来存放绘图点Z坐标
for y in y_lim:
    for x in x_lim:
        for z in z_lim:
            k=(x**2+(9/4)*y**2+z**2-1)**3-(9/80)*y**2*z**3-x**2*z**3
            if k<=0 :
                Z_tmp.append(z)
                if y<=-0.55 or y>=0.55:
                    X_points.append(x)
                    Y_points.append(y)    
                    Z_points.append(z)
        if Z_tmp:
            X_points.append(x)
            Y_points.append(y)    
            Z_points.append(max(Z_tmp))
            X_points.append(x)
            Y_points.append(y)    
            Z_points.append(min(Z_tmp))
            Z_tmp.clear()

plt.style.use('seaborn')
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d') 
ax.set_zlim(-1, 1)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.scatter(X_points,Y_points,Z_points)

plt.show()

运行效果

折线画法 (线团)

代码

import matplotlib.pyplot as plt #导入绘图模块
from mpl_toolkits.mplot3d import Axes3D #3d绘图模块
import numpy as np #导入数值计算拓展模块

#start generating points
x_lim=np.linspace(-10,10,150)
y_lim=np.linspace(-10,10,150)
z_lim=np.linspace(-10,10,150)
X_points=[] #用来存放绘图点X坐标
Y_points=[] #用来存放绘图点Y坐标
Z_tmp=[]
Z_points=[] #用来存放绘图点Z坐标
for y in y_lim:
    for x in x_lim:
        for z in z_lim:
            k=(x**2+(9/4)*y**2+z**2-1)**3-(9/80)*y**2*z**3-x**2*z**3
            if k<=0 :
                Z_tmp.append(z)
                if y<=-0.55 or y>=0.55:
                    X_points.append(x)
                    Y_points.append(y)    
                    Z_points.append(z)
        if Z_tmp:
            X_points.append(x)
            Y_points.append(y)    
            Z_points.append(max(Z_tmp))
            X_points.append(x)
            Y_points.append(y)    
            Z_points.append(min(Z_tmp))
            Z_tmp.clear()

plt.style.use('seaborn')
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d') 
ax.set_zlim(-1, 1)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.plot(X_points,Y_points,Z_points)

plt.show()

运行效果

等高线画法(线框)

代码

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np


def heart_3d(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 plot_implicit(fn, bbox=(-1.5, 1.5)):
    xmin, xmax, ymin, ymax, zmin, zmax = bbox*3
    fig = plt.figure()
    ax = fig.add_subplot(projection='3d')
    A = np.linspace(xmin, xmax, 100)  # resolution of the contour
    B = np.linspace(xmin, xmax, 10)  # number of slices
    A1, A2 = np.meshgrid(A, A)  # grid on which the contour is plotted

    for z in B:  # plot contours in the XY plane
        X, Y = A1, A2
        Z = fn(X, Y, z)
        cset = ax.contour(X, Y, Z+z, [z], zdir='z', colors=('r',))

    for y in B:  # plot contours in the XZ plane
        X, Z = A1, A2
        Y = fn(X, y, Z)
        cset = ax.contour(X, Y+y, Z, [y], zdir='y', colors=('red',))

    for x in B:  # plot contours in the YZ plane
        Y, Z = A1, A2
        X = fn(x, Y, Z)
        cset = ax.contour(X+x, Y, Z, [x], zdir='x', colors=('red',))

    # must set plot limits because the contour will likely extend
    # way beyond the displayed level. Otherwise matplotlib extends the plot limits
    # to encompass all values in the contour.
    ax.set_zlim3d(zmin, zmax)
    ax.set_xlim3d(xmin, xmax)
    ax.set_ylim3d(ymin, ymax)

    plt.show()


if __name__ == '__main__':
    plot_implicit(heart_3d)

运行效果

以上代码整理于网络,需要的小伙伴可以参考一下

到此这篇关于基于Python绘制3D立体爱心图案的示例详解的文章就介绍到这了,更多相关Python绘制3D立体爱心内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python怎么去除字符串最后的换行符‘\n’

    python怎么去除字符串最后的换行符‘\n’

    这篇文章主要介绍了python去除字符串最后的换行符'\n',本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • 如何用用Python将地址标记在地图上

    如何用用Python将地址标记在地图上

    这篇文章主要介绍了如何用用Python将地址标记在地图上,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-02-02
  • python机器学习高数篇之函数极限与导数

    python机器学习高数篇之函数极限与导数

    这篇文章主要介绍了python机器学习高数篇之函数极限和导数,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Python 中拼音库 PyPinyin 用法详解

    Python 中拼音库 PyPinyin 用法详解

    很多朋友问小编怎样把一批中文文件转拼音命名呢?下面就让我们来了解 Python 的一个库 PyPinyin 吧,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • pytorch环境配置及安装图文详解(包括anaconda的安装)

    pytorch环境配置及安装图文详解(包括anaconda的安装)

    这篇文章主要介绍了pytorch环境配置及安装图文详解(包括anaconda的安装),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • python实现ipsec开权限实例

    python实现ipsec开权限实例

    这篇文章主要介绍了python实现ipsec开权限的方法,弥补了windows自带的命令行工具netsh ipsec static add filter不支持批量添加及添加重复规则的不足,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • numpy基础教程之np.linalg

    numpy基础教程之np.linalg

    这篇文章主要给大家介绍了关于numpy基础教程之np.linalg的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • Python 12306抢火车票脚本

    Python 12306抢火车票脚本

    这篇文章主要为大家详细介绍了Python 12306抢火车票脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Python函数式编程之返回函数实例详解

    Python函数式编程之返回函数实例详解

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数,下面这篇文章主要给大家介绍了关于Python函数式编程之返回函数的相关资料,需要的朋友可以参考下
    2022-09-09
  • Python中截取字符串几种常用的方法

    Python中截取字符串几种常用的方法

    在Python中截取字符串的方法非常简单易懂,你只需要使用字符串的索引即可实现,这篇文章主要给大家介绍了关于Python中截取字符串几种常用的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05

最新评论