2014-12-03 6 views
6

Ich muss eine 3D-Punktwolke (Anzahl der Punkte: N) plotten, dann eine konvexe Hülle (eigentlich ein Polyeder mit N Ecken) von den Punkten. Ich habe ein Skript in Python mit scipy.spatial ConvexHull für Plot 8 Punkte und einen Würfel, die Zeichnung der Punktwolke ist in Ordnung, aber der Würfel ist nicht in Ordnung, weil der Code setzt zwei Zeilen über die diagonale Fläche des Würfels zusätzlich zu den Kantenlinien. Ich verstehe nicht, warum Linien über Gesichter geplottet werden.3D konvexe Hülle von Punktwolke

Das Skript:

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

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

points= np.array([[0,0,0], 
      [4,0,0], 
      [4,4,0], 
      [0,4,0], 
      [0,0,4], 
      [4,0,4], 
      [4,4,4], 
      [0,4,4]]) 

hull=ConvexHull(points) 

edges= zip(*points) 

for i in hull.simplices: 
    plt.plot(points[i,0], points[i,1], points[i,2], 'r-') 

ax.plot(edges[0],edges[1],edges[2],'bo') 

ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('z') 

ax.set_xlim3d(-5,5) 
ax.set_ylim3d(-5,5) 
ax.set_zlim3d(-5,5) 

plt.show() 

Ergebnis des Skripts:

enter image description here

+0

Wie kann ich meine Frage bearbeiten? Ich habe "Hi All" aus der ersten Zeile vergessen, und wenn ich auf "Bearbeiten" klicke und die Änderungen speichern möchte, passiert nichts. – Feri

Antwort

3

Ich weiß, das ist alt, aber ich kam hier von Google so glaube ich, auch andere könnten.

Das Problem besteht nur in der Plotmethode, die Sie verwenden. Ein Simplex ist ein durch 3 Punkte definiertes Dreieck. Die Plotfunktion muss jedoch zum letzten Punkt zurückkehren, ansonsten werden nur 2 von 3 Simplex-Kanten gezeichnet.

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


# 8 points defining the cube corners 
pts = np.array([[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], 
       [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1], ]) 

hull = ConvexHull(pts) 

fig = plt.figure() 
ax = fig.add_subplot(111, projection="3d") 

# Plot defining corner points 
ax.plot(pts.T[0], pts.T[1], pts.T[2], "ko") 

# 12 = 2 * 6 faces are the simplices (2 simplices per square face) 
for s in hull.simplices: 
    s = np.append(s, s[0]) # Here we cycle back to the first coordinate 
    ax.plot(pts[s, 0], pts[s, 1], pts[s, 2], "r-") 

# Make axis label 
for i in ["x", "y", "z"]: 
    [enter image description here][1]eval("ax.set_{:s}label('{:s}')".format(i, i)) 

plt.show() 
Verwandte Themen