2014-12-03 16 views
6

Potrzebuję wykreślić chmurę punktów 3D (liczba punktów: N), następnie wypukły kadłub (w rzeczywistości wielościan z wierzchołkami N) z punktów. Zrobiłem skrypt w pythonie z scipy.spatial ConvexHull dla wykresu 8 punktów i wykreśl kostkę, wykres chmury punktów jest w porządku, ale kostka nie jest w porządku, ponieważ kod stawia dwie linie przechodzące przez przekątną ścianę sześcianu oprócz linii krawędzi. Nie rozumiem, dlaczego linie kreślone są przez twarze.3D wypukły kadłub z chmury punktów

Skrypt:

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

Wynik skryptu:

enter image description here

+0

Jak mogę edytować swoje pytanie? Zapomniałem "Cześć wszystko" z pierwszego wiersza i jeśli kliknę "edytuj" i chcę zapisać zmiany, nic się nie dzieje. – Feri

Odpowiedz

3

wiem, że to jest stary, ale przyjechałem tu z Google więc myślę, że inni mogą też.

Problem dotyczy tylko metody drukowania, której używasz. Jeden simpleks to trójkąt nD zdefiniowany przez 3 punkty. Jednak funkcja kreślenia musi zostać cofnięta do ostatniego punktu, w przeciwnym razie zostaną narysowane tylko 2 z 3 prostych krawędzi.

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() 
Powiązane problemy