多面体的 Delaunay 三角化 (Python)
Delaunay triangularization of Polyhedron (Python)
我正在尝试在 scipy.spatial
中获取 Delaunay Triangulation of a polyhedron in python so that I can calculate the centroid. I see that there is a Delaunay 函数并且它在 n 维中工作。问题是文档显示了 2D 使用,但没有给我指示如何处理更高维度。能够将这个对象分解成一个数组可能会为我解决这个问题,但我不知道该怎么做。
我 运行 遇到的问题是我不知道如何验证它在输出对象时是否正常工作。我在 Google 上找不到任何有关如何绘制多面体或如何使用 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)
returns 是 Delanauy class 的对象。您可以将四面体检查为 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 三角剖分来计算多面体的质心。
质心是四面体质心的加权和,其中权重是每个四面体的体积。
您不需要将多面体分成四面体。
首先,对多面体的面进行三角剖分,即四边形被分割
分成两个共面三角形等
接下来,在 space 中选择一个任意点 p,比如原点。
现在,对于每个三角形面 (a,b,c),计算四面体的有符号体积
(p,a,b,c)。如果所有三角形都是逆时针方向,则此方法有效。
签名卷通过取消处理所有事情。
使用签名体积作为权重
乘以四面体质心。
Tetrahedra signed volume在我的书的第一章有解释,
"Computational Geometry in C."
我正在尝试在 scipy.spatial
中获取 Delaunay Triangulation of a polyhedron in python so that I can calculate the centroid. I see that there is a Delaunay 函数并且它在 n 维中工作。问题是文档显示了 2D 使用,但没有给我指示如何处理更高维度。能够将这个对象分解成一个数组可能会为我解决这个问题,但我不知道该怎么做。
我 运行 遇到的问题是我不知道如何验证它在输出对象时是否正常工作。我在 Google 上找不到任何有关如何绘制多面体或如何使用 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)
returns 是 Delanauy class 的对象。您可以将四面体检查为 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 三角剖分来计算多面体的质心。 质心是四面体质心的加权和,其中权重是每个四面体的体积。
您不需要将多面体分成四面体。 首先,对多面体的面进行三角剖分,即四边形被分割 分成两个共面三角形等 接下来,在 space 中选择一个任意点 p,比如原点。 现在,对于每个三角形面 (a,b,c),计算四面体的有符号体积 (p,a,b,c)。如果所有三角形都是逆时针方向,则此方法有效。 签名卷通过取消处理所有事情。 使用签名体积作为权重 乘以四面体质心。
Tetrahedra signed volume在我的书的第一章有解释, "Computational Geometry in C."