切片之间的Matplotlib填充

时间:2017-06-02 18:55:55

标签: python numpy matplotlib stl

我正致力于在python中创建3D打印机切片算法。该算法使用numpy-STL将.stl加载到numpy数组中,然后计算某个水平平面和网格三角形的交集。我成功地设法计算了交点并将交点存储在另一个numpy数组中(格式:[x1 y1 z1 x2 y2 z2 x3 y3 z3])。然后,我为每个切片提取x向量和y向量,并将它们存储用于绘图。

尝试可视化这些切片时出现问题。如果我使用以下方式绘制散点图:

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个点为蓝色。

1 个答案:

答案 0 :(得分:1)

如果您已经拥有三角形,则可能需要查看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