我有一组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的坐标,并用它们来着色球体。
结果应该如下所示:
1条答案
按热度按时间djmepvbi1#
您需要的是点云中的曲面网格。
您可以尝试使用CGal,参见this page的第5节,或参见all modules类别中的形状重建。你可以试试泊松重建。它需要点的法线。在你的例子中,这很容易通过取P-M来实现,其中M是中间(所有点的平均值),P是任何给定点。
在Python中,我发现this package和this package似乎提供了你想要的东西。球体的情况是非常基本的,所以我希望所有这些都能起作用。