问题:从3D点生成网格(使用x,y和z坐标).


我所拥有的是3D空间中的点(使用x,y和z坐标),您可以在图像1中看到它.
输出的是图像2或图像3或图像4.简而言之,它将是网格.如果我有网格,可以提供它上面的材料.
我见过很多人都说Delaunay三角剖分或受约束的Delaunay三角剖分将帮助我进行网格生成,但我最常发现的是它在2D点(仅有x和Y坐标)中的实现.
但我的问题是:我从图像1中可以看到3D点.
Delaunay三角测量或受约束的Delaunay三角测量是否适用于3D点?如果是,那怎么样?或者我是否必须找到另一种从3D点生成网格的算法?
注意:这里可以找到关于2D点的Delaunay三角剖分的一个很好的解释
我正在尝试绘制一个3D表面,以适应python中的某些{x,y,z}点 - 理想情况下就像Mathematica ListSurfacePlot3D函数.到目前为止,我已经尝试plot_surface并且plot_wireframe在我的观点上无济于事.
只有轴渲染plot_surface.plot_wireframe给出了一堆波浪状的,隐约在对象的形状,但不是文档中显示的漂亮的排序:
与以下结果比较ListSurfacePlot3D:

这是一个最小的工作示例,使用我在这里发布的test.csv文件:
import csv
from matplotlib import pyplot
import pylab
from mpl_toolkits.mplot3d import Axes3D
hFile = open("test.csv", 'r')
datfile = csv.reader(hFile)
dat = []
for row in datfile:
dat.append(map(float,row))
temp = zip(*(dat))
fig = pylab.figure(figsize=pyplot.figaspect(.96))
ax = Axes3D(fig)
Run Code Online (Sandbox Code Playgroud)
然后,要么
ax.plot_surface(temp[0], temp[1], temp[2])
pyplot.show()
Run Code Online (Sandbox Code Playgroud)
要么
ax.plot_wireframe(temp[0], temp[1], temp[2])
pyplot.show()
Run Code Online (Sandbox Code Playgroud)
这是它渲染的方式plot_surface:
和使用plot_wireframe:
和使用ListSurfacePlot3D:

我有以下代码来创建一个稍后将应用置换字段的圆锥体.在下图所示的图中,您可以看到一些大三角形在顶部绘制,但不在底部绘制.我相信有一些内部隐藏参数可以告诉plot_trisurf()我们应该创建三角形的距离,否则它们也应该在底部创建.
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from numpy import linspace, interp, meshgrid, sin, cos, pi
numel_circum = 120
L = 38.
rb, rt = (38., 16.)
t1, t2 = (0, 2*pi)
rav = ( rb - rt )*rt/rb + rt
perav = (t2-t1) * rav
elsize_L = perav / numel_circum
numel_L = int(round(L/elsize_L,0))
ts = linspace(t1, t2, numel_circum)
r = lambda z: interp( z, [0, L], [rb, rt] )
zs = …Run Code Online (Sandbox Code Playgroud) 我有一个vertices形状 (N,3) 的 numpy 数组,其中包含 3D 球形多边形的 N 个顶点,即所有这些点都位于球体的表面上。球体的中心和半径已知(以单位球体为例)。我想绘制由这些顶点包围的球形多边形。(从数学上来说,我想绘制这些顶点生成的球凸包)。
我该如何使用 来做到这一点matplotlib?我尝试过Poly3DCollection,但这只绘制了欧几里得多边形。plot_surface我设法用这样的方法绘制了整个单位球体:
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=5, cstride=5, color='y', alpha=0.1)
Run Code Online (Sandbox Code Playgroud)
我想人们可以手动计算要从中删除哪些点x, y, z,然后仍然使用这些点plot_surface来绘制多边形。这是正确的使用方法matplotlib还是它有另一个我可以直接使用的模块?
如果没有方便的方法来做到这一点matplotlib,你能推荐任何其他库吗?
matplotlib ×3
python ×3
3d ×2
algorithm ×1
convex-hull ×1
delaunay ×1
geometry ×1
mplot3d ×1
numpy ×1
plot ×1