我正在使用一个三角网格,该网格由点 3 x n 和由点索引 3 x m 指定的三角形组成。我可以很容易地绘制它,例如使用 mlab
mesh = mlab.triangular_mesh(p[0,:],p[1,:],p[2,:],t.T
我还在生成一个超出界或nan
的掩码遮罩点,所以我有一个大小为 n 的掩码。现在我想遮盖具有遮罩点的三角形。到目前为止,我的解决方案:
1:使用蒙版将所有遮罩点变成nan
,例如
p[mask] = nan
然后mlab
仍然显示nan
(我需要包含一个阈值过滤器......(,我实际上不想弄乱我的数据
2:生成一个三角形蒙版,我是这样开始的
def triangleMask(triangles, pointmask):
maskedTris = np.zeros((triangles.shape[1]), dtype=np.bool)
maskedIdx = np.nonzero(pointmask)[0]
for i,t in enumerate(triangles.T):
if (i%5000) == 0:
print('working it.:', i)
for p in t:
if p in maskedIdx:
maskedTris[i] = True
break
return maskedTris
这有效,但速度不快。就我而言,n = 250.000 和 m = 500.000,因此"不快"是一个很大的问题。
我知道mlab
中有一个掩码关键字,但我无法让它工作。仅屏蔽triangular_mesh调用中的点会产生和误差,因为 t 是指大于 p 大小的索引。
所以你有一个形状(3, n)
的points
数组,一个形状(3, m)
的triangles
数组和一个形状(n,)
的point_mask
布尔数组,并且想要创建一个形状triangle_mask
,如果triangles[:, j]
中的任何索引对应于point_mask
中的True
,则(m,)
将True
保持在位置j
。您可以通过一些花哨的索引来做到这一点:
triangle_mask = np.any(point_mask[triangles], axis=0)
为了理解发生了什么,point_mask[triangles]
创建了一个形状(3, m)
的布尔数组,位置(i, j)
的值point_mask[triangles[i, j]]
。