【问题标题】:Delaunay triangularization of Polyhedron (Python)多面体的德劳内三角化(Python)
【发布时间】:2016-04-21 14:18:30
【问题描述】:

我正在尝试在 python 中获取多面体的Delaunay Triangulation,以便计算质心。我看到scipy.spatial 中有一个Delaunay 函数,并且它在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    '

【问题讨论】:

  • 您不需要 Delaunay 三角剖分来计算质心。您可以计算适当的四面体质心加权和。
  • 如何获得四面体?在这种特殊情况下,它很简单,但对于任意六面体?
  • 我已将评论扩展为答案。

标签: python matplotlib scipy delaunay polyhedra


【解决方案1】:

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()

生成的图像是

【讨论】:

  • 打败我!但比我想出的要好得多:)
  • 谢谢,这真的很有帮助。
【解决方案2】:

您不需要 Delaunay 三角剖分来计算多面体的质心。 质心是四面体质心的加权和,其中权重是每个四面体的体积。

您不需要将多面体划分为四面体。 首先,对多面体的面进行三角剖分,即四边形被分割 分成两个共面三角形等。 接下来,选择空间中的任意点 p,例如原点。 现在,对于每个三角形面 (a,b,c),计算四面体的有符号体积 (p,a,b,c)。如果所有三角形都是逆时针方向的,则此方法有效。 签名卷通过取消处理所有事情。 使用有符号的体积作为重量 将四面体质心相乘。

四面体符号量在我的书的第 1 章中进行了解释, "Computational Geometry in C."

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 2012-04-27
    • 2012-05-06
    • 2014-03-24
    • 2015-08-29
    • 2021-08-24
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多