matplotlib 使用mesh3d绘制闭合曲面

qojgxg4l  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(193)

我有一组3D数据(X,Y,Z)和一个值数组(让我们称之为C)。X、Y、Z和C具有相同的长度。
我的目标是通过创建具有X、Y、Z点的3D网格来绘制曲面,并根据C的值为每个点(即曲面)上色。
我设法使用plotly库后在这里寻求帮助。它在大多数情况下工作得很好。但是,它不能绘制闭合曲面(例如一个球体),但它只绘制了它的下半部分。

import plotly.graph_objects as go
import numpy as np

DATA = np.loadtxt(open("surface.dat", "rb"))
Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]

value = np.loadtxt(open("0.dat", "rb"))

fig = go.Figure(data=[
    go.Mesh3d(
        x=Xs,
        y=Ys,
        z=Zs,
        colorbar_title='value',
        colorscale="hot",
        # Intensity of each vertex, which will be interpolated and color-coded
        intensity=value,
        showscale=True
    )
])

fig.show()

我知道这是因为plotly的mesh3d不能为X,Y对取多个Z值,所以我甚至尝试绘制两个半形状,一个为底部,一个为上部,但这导致在两个半中间有一个洞。
下面是代码和结果:

import plotly.graph_objects as go
import numpy as np

DATA = np.loadtxt(open("surface.dat", "rb"))
Xs = DATA[:,0]
Ys = DATA[:,1]
Zs = DATA[:,2]
value = np.loadtxt(open("0.dat", "rb"))

#find the permutation that put Z in ascending order
p = Zs.argsort()

#sort the arrays with that permutation and invert them ('pos' stands for 'positive')
Xpos = Xs[p][::-1]
Ypos = Ys[p][::-1]
Zpos = Zs[p][::-1]
Vpos = value[p][::-1]

top = go.Mesh3d(
    x=Xpos,
    y=Ypos,
    z=Zpos,
    colorbar_title='value',
    colorscale="hot",
    intensity=Vpos,
    showscale=True
)

bottom = go.Mesh3d(
    x=Xs,
    y=Ys,
    z=Zs,
    colorbar_title='value',
    colorscale="hot",
    intensity=value,
    showscale=True
)

fig = go.Figure(data=[top,bottom])
fig.show()

有没有办法实现我所需要的?一些解决方案可以是:

  • 以某种方式填满连接两半的孔
  • 使用不同的库(例如,matplotlib,Open3D)
  • 用一种完全不同的方法
  • 先画出球体然后上色。我不喜欢最后一个解决方案,因为形状应该是任意的(不是函数),但如果没有其他解决方案存在,我可以得到C的坐标,并用它们来着色球体。

结果应该如下所示:

djmepvbi

djmepvbi1#

您需要的是点云中的曲面网格。
您可以尝试使用CGal,参见this page的第5节,或参见all modules类别中的形状重建。你可以试试泊松重建。它需要点的法线。在你的例子中,这很容易通过取P-M来实现,其中M是中间(所有点的平均值),P是任何给定点。
在Python中,我发现this packagethis package似乎提供了你想要的东西。球体的情况是非常基本的,所以我希望所有这些都能起作用。

相关问题