我正在用python创建一个3D打印机切片算法。该算法使用numpy-STL将一个.stl加载到numpy数组中,然后计算某个水平面和网格三角形的交点。我已经成功地计算了交点,并将交点存储在另一个numpy数组中(格式:[x1y1 z1 x2 y2 z2 x3 y3 z3])。然后,我提取每个切片的x向量和y向量,并将它们存储起来以便绘图。
当试图可视化这些切片时,问题就来了。如果我用以下公式绘制散点图:
import matplotlib as plt
plt.scatter(x_vec,y_vec)
我得到:x1c 0d1x这正是我所期望的。
但是,当我尝试使用以下命令连接线段时:
plt.plot(x_vec,y_vec)
我得到了两个不属于同一个地方的点之间的奇怪的连线:
。我在这里尝试切片的形状是一个简单的环。当直接检查散点图时,我看不到任何无关的点,当手动梳理点数据时,它们似乎也都正确排序。
这是matplotlib连接最近的线的方式的问题吗?如果我使用fill_between
,它会搞不清哪些部分是内部的,哪些不是。如果我查看3D中堆叠的多个切片,mplot 3D有解决方案吗?我已经尝试过:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x_vec, y_vec, z_vec, color = 'b')
但是在三维中也是一样的。有什么关于可视化这些切片的建议吗?其他包等等?
我认为连接线是slicer返回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个点段显示为蓝色。
1条答案
按热度按时间juzqafwq1#
如果你已经有了三角形,你可能想看看
plt.tripcolor
,因为你的确切数据格式还不清楚,我不能在这里给予更多的帮助。除此之外,你可以将数据点分别分割成内圆和外圆,并为外圆的值绘制一个填充了某种颜色的多边形。然后,为内圆的值绘制一个背景色的多边形。结果看起来就像你在那里有一个环。