多面体的Delaunay三角化(Python)
我试图在python中获得多面体的形状,以便计算质心。我看到在多面体的Delaunay三角化(Python),python,matplotlib,scipy,delaunay,polyhedra,Python,Matplotlib,Scipy,Delaunay,Polyhedra,我试图在python中获得多面体的形状,以便计算质心。我看到在scipy.spatial中有一个函数,它在n维中工作。问题是,文档显示了2D的使用,但没有说明如何处理更高的维度。能够将这个对象分解成一个数组可能会为我解决这个问题,但我不知道如何做到这一点 我遇到的问题是,在输出对象时,我不知道如何验证它是否正常工作。我在谷歌上找不到任何关于如何绘制多面体或如何使用scipy吐回的对象的信息 如果我这样做 import numpy as np from scipy.spatial import D
scipy.spatial
中有一个函数,它在n维中工作。问题是,文档显示了2D的使用,但没有说明如何处理更高的维度。能够将这个对象分解成一个数组可能会为我解决这个问题,但我不知道如何做到这一点
我遇到的问题是,在输出对象时,我不知道如何验证它是否正常工作。我在谷歌上找不到任何关于如何绘制多面体或如何使用scipy吐回的对象的信息
如果我这样做
import numpy as np
from scipy.spatial import Delaunay
points = np.array([[0,0,0],[1,0,0],[1,1,0],[1,0,1],[1,1,1],[0,1,0],[0,1,1],[0,0,1]])
Delaunay(points)
我真的希望能够得到这些四面体的坐标,这样我就可以计算出多面体的质心。如果我也能画出镶嵌多面体的图形,那就太好了。我在MATLAB中看到,我可以用一个名为trimesn的函数来实现这一点,我从matplotlib中找到了一个函数,但它似乎真的不同,它的文档也不太好
from matplotlib.collections import TriMesh TriMesh.__doc__
u'\n Class for the efficient drawing of a triangular mesh using\n
Gouraud shading.\n\n A triangular mesh is a
:class:`~matplotlib.tri.Triangulation`\n object.\n '
tess=Delaunay(pts)返回的是Delanauy类的对象。您可以将四面体检查为tess.simplices
。它有不同的属性和方法。例如,在2D中,它可以绘制三角剖分、凸包和Voronoi细分
关于最终四面体集合的可视化,我没有找到一种简单的方法,但我设法得到了一个工作脚本。检查下面的代码
from __future__ import division
import numpy as np
from scipy.spatial import Delaunay
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3DCollection
from itertools import combinations
def plot_tetra(tetra, pts, color="green", alpha=0.1, lc="k", lw=1):
combs = combinations(tetra, 3)
for comb in combs:
X = pts[comb, 0]
Y = pts[comb, 1]
Z = pts[comb, 2]
verts = [zip(X, Y, Z)]
triangle = Poly3DCollection(verts, facecolors=color, alpha=0.1)
lines = Line3DCollection(verts, colors=lc, linewidths=lw)
ax.add_collection3d(triangle)
ax.add_collection3d(lines)
pts = np.array([
[0,0,0],
[1,0,0],
[1,1,0],
[1,0,1],
[1,1,1],
[0,1,0],
[0,1,1],
[0,0,1]])
tess = Delaunay(pts)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for k, tetra in enumerate(tess.simplices):
color = plt.cm.Accent(k/(tess.nsimplex - 1))
plot_tetra(tetra, pts, color=color, alpha=0.1, lw=0.5, lc="k")
ax.scatter(pts[:, 0], pts[:, 1], pts[:, 2], c='k')
plt.savefig("Delaunay.png", dpi=600)
plt.show()
生成的图像是
计算多面体的质心不需要Delaunay三角剖分。 质心是四面体质心的加权和,其中的重量是每个四面体的体积 您不需要将多面体划分为四面体。 首先,对多面体的面进行三角剖分,即四边形进行分区 分成两个共面三角形等。 接下来,在空间中拾取任意点p,例如原点。 现在,对于每个三角形面(a,b,c),计算四面体的有符号体积 (p,a,b,c)。如果所有三角形的方向都是逆时针的,则此操作有效。 签名卷通过取消处理所有事务。 使用已签名的卷作为权重 乘以四面体的质心 我的书的第一章解释了四面体符号体积,
比我快!但比我想的要好得多:)谢谢,这真的很有帮助。你不需要Delaunay三角剖分来计算质心。你可以计算四面体质心的适当加权和。我如何得到四面体?在这种特殊情况下,它很简单,但对于任意六面体,我已经将我的评论扩展到一个答案。