4

重心を計算できるように、python で多面体のDelaunay Triangulationを取得しようとしています。にDelaunay関数がscipy.spatialあり、それが n 次元で機能することがわかります。問題は、ドキュメンテーションが 2D の使用を示しており、より高い次元で何をすべきかを示していないことです。このオブジェクトを配列に分解できれば、おそらくこの問題は解決するでしょうが、その方法がわかりません。

私が直面している問題は、オブジェクトを出力しているため、これが正しく機能していることを確認する方法がわからないことです。多面体をグラフ化する方法や、scipy が吐き出すこのオブジェクトの使用方法について、Google で何も見つかりません。

私が行った場合

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    '
4

2 に答える 2

4

返されるのはDelanauytess = Delaunay(pts)クラスのオブジェクトです。として四面体を確認できますtess.simplices。さまざまな属性とメソッドがあります。たとえば、2D では、三角形分割、凸包、ボロノイ分割をプロットできます。

四面体の最終コレクションの視覚化に関しては、それを行う簡単な方法は見つかりませんでしたが、なんとか機能するスクリプトを取得することができました。以下のコードを確認してください。

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

結果の画像は

ここに画像の説明を入力

于 2016-01-15T23:23:47.247 に答える