[英]3D convex hull from point cloud
我需要從點繪制一個3D點雲(點數:N),然后繪制一個凸包(實際上是一個帶有N個頂點的多面體)。 我在python中使用scipy.spatial ConvexHull創建了一個腳本,用於繪制8個點並繪制一個立方體,點雲的圖是可以的,但是立方體不好,因為代碼將兩條線穿過立方體的對角線面除了邊緣線。 我不明白為什么要在臉上畫線。
劇本:
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()
腳本的結果:
我知道這已經過時了,但我是從Google來到這里的,所以我認為其他人也可能。
問題僅出在您使用的繪圖方法中。 一個單純形是由3個點定義的nD三角形。 但是繪圖功能必須循環回到最后一個點,否則只繪制3個單面邊中的2個。
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"]:
eval("ax.set_{:s}label('{:s}')".format(i, i))
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.