2014-12-03 24 views
6

Tôi cần vẽ một đám mây điểm 3D (số điểm: N), sau đó một lồi lồi (thực ra là một đa diện với N đỉnh) từ các điểm. Tôi đã thực hiện một kịch bản trong python với scipy.spatial ConvexHull cho âm mưu 8 điểm và vẽ một khối lập phương, cốt truyện của đám mây điểm là ok, nhưng khối lập phương là không ok, bởi vì mã đặt hai dòng đi qua mặt chéo của khối lập phương ngoài các đường viền. Tôi không hiểu tại sao âm mưu đường ngang qua mặt.Thân lồi 3D từ đám mây điểm

Kịch bản:

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

quả của kịch bản:

enter image description here

+0

Tôi có thể chỉnh sửa câu hỏi của mình bằng cách nào? Tôi quên "Hi All", từ hàng đầu tiên, và nếu tôi nhấp vào "chỉnh sửa" và tôi muốn lưu các thay đổi, không có gì xảy ra. – Feri

Trả lời

3

Tôi biết điều này là cũ, nhưng tôi đến đây từ Google vì vậy tôi nghĩ rằng người khác có thể quá.

Sự cố chỉ xảy ra với phương pháp vẽ sơ đồ mà bạn sử dụng. Một simplex là một tam giác nD được xác định bởi 3 điểm. Nhưng chức năng vẽ đồ thị phải quay trở lại điểm cuối cùng, nếu không chỉ có 2 trong 3 cạnh đơn giản được vẽ.

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() 
Các vấn đề liên quan