我正在创建一个3D打印机切片算法在Python中。该算法使用numpy-STL将.stl加载到numpy数组中,然后计算某个水平面与网格三角形的交点。我已成功设法计算交点并将交点存储在另一个numpy数组(格式:[x1 y1 z1 x2 y2 z2 x3 y3 z3])中。然后,我为每个切片提取x个矢量和y个矢量,并存储它们进行绘图。Matplotlib填充切片
尝试对这些切片进行可视化时会出现问题。如果我用绘制散点图:
import matplotlib as plt
plt.scatter(x_vec,y_vec)
我得到:这是我所期待什么。
但是,当我尝试使用连接段:
plt.plot(x_vec,y_vec)
我得到的不是本地彼此点之间的线路连接怪异:。我试图在这里切片的形状是一个简单的环。当直接检查散点图时以及手工梳理点数据时,我看不到任何无关的点,它们都显示为正确排列。
这是matplotlib如何连接最近的线问题?如果我使用fill_between
,会很困惑哪些部分是内部的,哪些不是。如果我查看堆叠在3D中的多个切片,mplot3D是否有解决方案?我试过这个:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x_vec, y_vec, z_vec, color = 'b')
但它只是在3D中的同样的事情。任何关于可视化这些切片的建议?其他软件包等?
我认为连接的线是切片机如何返回numpy数据的结果。此函数采用的(M,9)的三角形阵列,并返回任一(1,3)(1,6)或根据条件(1,9)阵列:
def get_intersects(tri_entry, layer_h):
# Calculate intersections for current triangles
# 4 Cases
# Case 1: 3 vertices on plane
if check_points(tri_entry[2::3], layer_h) == 3:
return tri_entry
# Case 2: 2 vertices on plane
if check_points(tri_entry[2::3], layer_h) == 2:
return coords_on_plane(tri_entry, layer_h)
# Case 3: 1 vertex on plane
if check_points(tri_entry[2::3], layer_h) == 1:
# 2 Sub cases
# (1) Other 2 points on opposited sides of slice
if check_z(tri_entry, layer_h) == 0:
intersect = vec_intersect(tri_entry, layer_h)
return np.hstack((intersect, coords_on_plane(tri_entry, layer_h)))
# (2) Other 2 points on same side of slice
if check_z(tri_entry, layer_h) == 1:
return coords_on_plane(tri_entry, layer_h)
# Case 4: 0 vertices on plane
if check_points(tri_entry[2::3], layer_h) == 0:
# Check which lines interesct
a = vec_intersect(tri_entry[0:6], layer_h)
b = vec_intersect(tri_entry[3:9], layer_h)
c = vec_intersect(tri_entry[[0,1,2,6,7,8]], layer_h)
intersect = np.hstack((a, b, c))
intersect = list(filter(None.__ne__, intersect))
return np.asarray(intersect)
试图通过向量化表的所有x和y的没有考虑点的依赖是我出错的地方。我试图单独绘制每个案例,并发现:Zoomed-colored
单点呈红色,两点呈绿色,3点呈蓝色。
感谢您的答复!我已经为我的问题添加了一些更多描述,并将尝试使用plt.Polygon来处理三点情况。 – Jetpack