基于Python繪制3D立體愛(ài)心圖案的示例詳解
原理
1.使用python中的mtplotlib庫(kù)。
2.立體愛(ài)心面公式

點(diǎn)畫(huà)法(實(shí)心)
代碼
import matplotlib.pyplot as plt #導(dǎo)入繪圖模塊
from mpl_toolkits.mplot3d import Axes3D #3d繪圖模塊
import numpy as np #導(dǎo)入數(shù)值計(jì)算拓展模塊
#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=[] #用來(lái)存放繪圖點(diǎn)X坐標(biāo)
Y_points=[] #用來(lái)存放繪圖點(diǎn)Y坐標(biāo)
Z_points=[] #用來(lái)存放繪圖點(diǎn)Z坐標(biāo)
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()
運(yùn)行效果

這個(gè)畫(huà)法側(cè)面看起來(lái)很無(wú)語(yǔ)。

點(diǎn)畫(huà)法(空心)
代碼
import matplotlib.pyplot as plt #導(dǎo)入繪圖模塊
from mpl_toolkits.mplot3d import Axes3D #3d繪圖模塊
import numpy as np #導(dǎo)入數(shù)值計(jì)算拓展模塊
#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=[] #用來(lái)存放繪圖點(diǎn)X坐標(biāo)
Y_points=[] #用來(lái)存放繪圖點(diǎn)Y坐標(biāo)
Z_tmp=[]
Z_points=[] #用來(lái)存放繪圖點(diǎn)Z坐標(biāo)
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()
運(yùn)行效果

折線畫(huà)法 (線團(tuán))
代碼
import matplotlib.pyplot as plt #導(dǎo)入繪圖模塊
from mpl_toolkits.mplot3d import Axes3D #3d繪圖模塊
import numpy as np #導(dǎo)入數(shù)值計(jì)算拓展模塊
#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=[] #用來(lái)存放繪圖點(diǎn)X坐標(biāo)
Y_points=[] #用來(lái)存放繪圖點(diǎn)Y坐標(biāo)
Z_tmp=[]
Z_points=[] #用來(lái)存放繪圖點(diǎn)Z坐標(biāo)
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()
運(yùn)行效果

等高線畫(huà)法(線框)
代碼
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)
運(yùn)行效果

以上代碼整理于網(wǎng)絡(luò),需要的小伙伴可以參考一下
到此這篇關(guān)于基于Python繪制3D立體愛(ài)心圖案的示例詳解的文章就介紹到這了,更多相關(guān)Python繪制3D立體愛(ài)心內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python機(jī)器學(xué)習(xí)高數(shù)篇之函數(shù)極限與導(dǎo)數(shù)
這篇文章主要介紹了python機(jī)器學(xué)習(xí)高數(shù)篇之函數(shù)極限和導(dǎo)數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
pytorch環(huán)境配置及安裝圖文詳解(包括anaconda的安裝)
這篇文章主要介紹了pytorch環(huán)境配置及安裝圖文詳解(包括anaconda的安裝),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
python實(shí)現(xiàn)ipsec開(kāi)權(quán)限實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)ipsec開(kāi)權(quán)限的方法,彌補(bǔ)了windows自帶的命令行工具netsh ipsec static add filter不支持批量添加及添加重復(fù)規(guī)則的不足,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11
Python函數(shù)式編程之返回函數(shù)實(shí)例詳解
函數(shù)式編程的一個(gè)特點(diǎn)就是,允許把函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù),還允許返回一個(gè)函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python函數(shù)式編程之返回函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-09-09

