Triangle triangular surface 3D scipy.spatial.Delaunay

I have this problem. I am trying to triangulate a point cloud on scipy.spatial.Delaunay. I used:

tri = Delaunay(points) # points: np.array() of 3d points indices = tri.simplices vertices = points[indices] 

But this code returns a tetrahedron. How is it possible only to return the triangle of the surface?

thanks

+5
source share
2 answers

To make it work in code form, you need to parameterize the surface in 2D. For example, in the case of the ball (r, theta, psi), the radius is constant (drops out), and the points are set (theta, psi), which is 2D.

Scipy Delaunay is an N-dimensional triangulation, so if you give 3D points, it returns 3D objects. Give it 2D points and it will return 2D objects.

Below is the script that I used to create polyhedrons for openSCAD. U and V are my parameterization (x and y), and these are the coordinates that I give to Delaunay. Please note that now the “Delaunay triangulation properties” are applied only in u, v coordinates (angles are maximized in uv-space, but not in xyz-space, etc.).

An example is a modified copy of http://matplotlib.org/1.3.1/mpl_toolkits/mplot3d/tutorial.html , which initially uses the triangulation function (maps in the end?)

 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import matplotlib.tri as mtri from scipy.spatial import Delaunay # u, v are parameterisation variables u = np.array([0,0,0.5,1,1]) v = np.array([0,1,0.5,0,1]) x = u y = v z = np.array([0,0,1,0,0]) # Triangulate parameter space to determine the triangles #tri = mtri.Triangulation(u, v) tri = Delaunay(np.array([u,v]).T) print 'polyhedron(faces = [' #for vert in tri.triangles: for vert in tri.simplices: print '[%d,%d,%d],' % (vert[0],vert[1],vert[2]), print '], points = [' for i in range(x.shape[0]): print '[%f,%f,%f],' % (x[i], y[i], z[i]), print ']);' fig = plt.figure() ax = fig.add_subplot(1, 1, 1, projection='3d') # The triangles in parameter space determine which x, y, z points are # connected by an edge #ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap=plt.cm.Spectral) ax.plot_trisurf(x, y, z, triangles=tri.simplices, cmap=plt.cm.Spectral) plt.show() 

Pyramid what the above example plots

Below is a (slightly more structured) text:

 polyhedron( faces = [[2,1,0], [3,2,0], [4,2,3], [2,4,1], ], points = [[0.000000,0.000000,0.000000], [0.000000,1.000000,0.000000], [0.500000,0.500000,1.000000], [1.000000,0.000000,0.000000], [1.000000,1.000000,0.000000], ]); 
+6
source

It looks like you want to calculate the convex hull of your point cloud. I think this is what you want to do:

 from scipy.spatial import ConvexHull hull = ConvexHull(points) indices = hull.simplices vertices = points[indices] 
+1
source

Source: https://habr.com/ru/post/1204956/


All Articles