2017-06-02 150 views
0

我正在创建一个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) 

我得到:Ring这是我所期待什么。

但是,当我尝试使用连接段:

plt.plot(x_vec,y_vec) 

我得到的不是本地彼此点之间的线路连接怪异:Weird Lines。我试图在这里切片的形状是一个简单的环。当直接检查散点图时以及手工梳理点数据时,我看不到任何无关的点,它们都显示为正确排列。

这是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点呈蓝色。

回答

0

如果您已经有三角形可供您使用,您可能需要查看plt.tripcolor。 由于您的确切数据格式不清楚,因此我无法在此处给予进一步的帮助。

除此之外,您可以分别将数据点分成内圆和外圆,并为外部值绘制某个颜色的填充多边形。然后,用backgroundcolor绘制一个Polygon作为内部值。结果会看起来像你在那里有一个戒指。

import matplotlib.pyplot as plt 
import numpy as np 

phi1 = np.linspace(0,2*np.pi) 
x1 = np.cos(phi1) 
y1 = -np.sin(phi1) 

phi2 = np.linspace(0.06,2*np.pi+0.06) 
x2 = 0.9*np.cos(phi2) 
y2 = -0.9*np.sin(phi2) 

fig, ax=plt.subplots() 

p1 = plt.Polygon(np.c_[x1,y1], color="lightskyblue") 
ax.add_patch(p1) 
p2 = plt.Polygon(np.c_[x2,y2], color="white") 
ax.add_patch(p2) 

ax.scatter(x1,y1, s=10, zorder=4) 
ax.scatter(x2,y2, s=10, zorder=4) 

plt.show() 

enter image description here

+0

感谢您的答复!我已经为我的问题添加了一些更多描述,并将尝试使用plt.Polygon来处理三点情况。 – Jetpack