在一个球内给定顶点,绘制一个三维曲面。

5

我有6个点,这些点都位于一个球面上,并且是八面体的顶点。如何在三维坐标系中绘制球内八面体的表面?

我有以下代码,但它并没有做我希望的事情:

from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt

Points=[[ 0.17770898,  0.72315927,  0.66742804],
       [-0.65327074, -0.4196453 ,  0.63018661],
       [ 0.65382635,  0.42081934, -0.62882604],
       [-0.17907021, -0.72084723, -0.66956189],
       [-0.73452809,  0.5495376 , -0.39809158],
       [ 0.73451554, -0.55094017,  0.39617148]]

fig=plt.figure()
ax =fig.add_subplot(1, 1, 1, projection='3d', aspect='auto')

ax.add_collection3d(Poly3DCollection([Points]))

u = np.linspace(0, np.pi, 30)
v = np.linspace(0, 2 * np.pi, 30)

x = np.outer(np.sin(u), np.sin(v))
y = np.outer(np.sin(u), np.cos(v))
z = np.outer(np.cos(u), np.ones_like(v))

ax.plot_wireframe(x, y, z, alpha=0.3)

plt.show()

这是当前的情节。没有错误,但八面体表面不正确。

enter image description here


1
你知道哪一行代码出错了吗? - cassandracomar
请发布完整的回溯信息。 - tacaswell
2个回答

4
补充HYRY的回答:一个体积是由多个多边形面组成的列表构建的,每个面又由一系列点列表构建而成。(如果面相邻,则每个点在列表中会出现多次)。考虑以下代码片段,其中已经标记了点。 python 3.11.2matplotlib 3.7.1numpy 1.24.3 中测试通过
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure ()
ax = fig.add_subplot (1, 1, 1, projection = '3d', aspect = 'auto')

# octahedron
A = [ 0.17770898,  0.72315927,  0.66742804]
B = [-0.65327074, -0.4196453 ,  0.63018661]
C = [ 0.65382635,  0.42081934, -0.62882604]
D = [-0.17907021, -0.72084723, -0.66956189]
E = [-0.73452809,  0.5495376 , -0.39809158]
F = [ 0.73451554, -0.55094017,  0.39617148]
OCTO = [[E, A, B],
        [E, B, D],
        [E, D, C],
        [E, C, A],
        [F, A, B],
        [F, B, D],
        [F, D, C],
        [F, C, A],
]
ax.add_collection3d (Poly3DCollection (OCTO))

# sphere
u = np.linspace (0, np.pi, 30)
v = np.linspace (0, 2 * np.pi, 30)
x = np.outer (np.sin (u), np.sin (v))
y = np.outer (np.sin (u), np.cos (v))
z = np.outer (np.cos (u), np.ones_like (v))
ax.plot_wireframe (x, y, z, alpha = 0.3)

plt.show ()

enter image description here


这个解决方案是可行的,但对于非常大的点集,将会导致一个名为“OCTO”的变量具有重复数据。更好的解决方案是让我们使用整数索引来访问点集合。你知道如何做吗? - ofloveandhate
嘿,这个可以解决你想要使用类似Matlab补丁的面和顶点,但不是在matplotlib中的问题:mayavi的triangular_mesh - ofloveandhate
Matplotlib不支持3D图中的aspect = 1(它从未得到过很好的支持,但最近已更改为抛出NotImplementedError)。请参见https://github.com/matplotlib/matplotlib/issues/1077。 - Filip S.

2

Poly3DCollection是多边形的列表,而一个多边形是点的列表,一个点是包含三个值的列表。因此,您应该将一个值的列表的列表的列表传递给Poly3DCollection。请更改以下代码:

ax.add_collection3d(Poly3DCollection([Points]))

非常感谢,那解决了错误,但我对自己想要的东西不是很清楚。请查看我编辑过的问题。 - Thomas Hopkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接