简体   繁体   English

如何在Python中可视化3D delaunay三角剖分?

[英]How to visualize 3D delaunay triangulation in Python?

I have a set of 3D points which I've used scipy.spatial.Delaunay to do the triangulation / tetrahedralization. 我有一组3D点,我用scipy.spatial.Delaunay进行三角测量/四面体化。 I now have a set of unique faces of all of the tetrahedra, and would like to visualize these in 3D. 我现在拥有一组所有四面体的独特面孔,并希望在3D中可视化这些面部。

Are there any Python libraries (or libraries with a Python wrapper) that can do this? 是否有可以执行此操作的Python库(或带有Python包装器的库)?

Try mayavi.mlab.triangular_mesh() 尝试mayavi.mlab.triangular_mesh()

import numpy as np
from mayavi import mlab
vertices = np.array([[0, 1, 0, 0],[0, 0, 1, 0],[0, 0, 0, 1]])
faces = np.array([[0, 1, 0, 0],[1, 2, 1, 2],[2, 3, 3, 3]])
mlab.triangular_mesh(vertices[0,:], vertices[1,:], vertices[2,:], faces.T)
mlab.show()

It can also be done using the three-dimensional plotting of matplotlib (without the need for the mayavi package). 它也可以使用matplotlib的三维绘图(不需要mayavi包)来完成。

The following code is an initial simple implementation of such a function. 以下代码是这种函数的初始简单实现。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from scipy.spatial import Delaunay

def plot_tri_simple(ax, points, tri):
    for tr in tri.simplices:
        pts = points[tr, :]
        ax.plot3D(pts[[0,1],0], pts[[0,1],1], pts[[0,1],2], color='g', lw='0.1')
        ax.plot3D(pts[[0,2],0], pts[[0,2],1], pts[[0,2],2], color='g', lw='0.1')
        ax.plot3D(pts[[0,3],0], pts[[0,3],1], pts[[0,3],2], color='g', lw='0.1')
        ax.plot3D(pts[[1,2],0], pts[[1,2],1], pts[[1,2],2], color='g', lw='0.1')
        ax.plot3D(pts[[1,3],0], pts[[1,3],1], pts[[1,3],2], color='g', lw='0.1')
        ax.plot3D(pts[[2,3],0], pts[[2,3],1], pts[[2,3],2], color='g', lw='0.1')

    ax.scatter(points[:,0], points[:,1], points[:,2], color='b')

The result of calling this function with the test code below results in the following figure: 使用下面的测试代码调用此函数的结果如下图所示: 在此输入图像描述

np.random.seed(0)
x = 2.0 * np.random.rand(20) - 1.0
y = 2.0 * np.random.rand(20) - 1.0
z = 2.0 * np.random.rand(20) - 1.0
points = np.vstack([x, y, z]).T
tri = Delaunay(points)

fig = plt.figure()
ax = plt.axes(projection='3d')
plot_tri(ax, points, tri)

The code above is slow because the plot is done within the loop. 上面的代码很慢,因为绘图是在循环内完成的。 Furthermore, it works on each simplex separately so edges are rendered more than once. 此外,它分别适用于每个单纯形,因此边缘不止一次呈现。 A more efficient implementation follows, which makes use of an auxiliary function collect_edges to take each edge only once, and uses np.nan values in the plot function to draw the edge segments in a single plot command. 接下来是一个更有效的实现,它使用辅助函数collect_edges只获取每个边一次,并使用绘图函数中的np.nan值在单个绘图命令中绘制边缘段。

The result of running the test code above with the new function gives an identical figure but the running time is improved by a factor of x80 on my machine (300 ms compared to 3.6 ms). 使用新函数运行上面的测试代码的结果给出了相同的数字,但是我的机器上的运行时间提高了x80倍(300毫秒与3.6毫秒相比)。

def plot_tri_2(ax, points, tri):
    edges = collect_edges(tri)
    x = np.array([])
    y = np.array([])
    z = np.array([])
    for (i,j) in edges:
        x = np.append(x, [points[i, 0], points[j, 0], np.nan])      
        y = np.append(y, [points[i, 1], points[j, 1], np.nan])      
        z = np.append(z, [points[i, 2], points[j, 2], np.nan])
    ax.plot3D(x, y, z, color='g', lw='0.1')

    ax.scatter(points[:,0], points[:,1], points[:,2], color='b')


def collect_edges(tri):
    edges = set()

    def sorted_tuple(a,b):
        return (a,b) if a < b else (b,a)
    # Add edges of tetrahedron (sorted so we don't add an edge twice, even if it comes in reverse order).
    for (i0, i1, i2, i3) in tri.simplices:
        edges.add(sorted_tuple(i0,i1))
        edges.add(sorted_tuple(i0,i2))
        edges.add(sorted_tuple(i0,i3))
        edges.add(sorted_tuple(i1,i2))
        edges.add(sorted_tuple(i1,i3))
        edges.add(sorted_tuple(i2,i3))
    return edges

blender BPY could do this, so could BGE python. 搅拌机BPY可以做到这一点,BGE python也是如此。

blender.org blender.org

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM