网格中的独特三角形



我有一个三角形网格存储在numpy中。有些三角形是重复的,我想删除它们。 我的numpy数组示例:

# Some points
a=(-2,-2,0)
b=(1,-2,0)
c=(1, 1,0)
d=(-2,1,0)
e=(-2,-2,1)
f=(1,-2,1)
g=(1,1,1)
h=(-2,1,1)
# Some triangles
t1=(a,b,c)
t2=(c,d,a)
t3=(e,f,g)
t4=(g,h,e)
# The numpy array with duplicated t1 and t3
points=numpy.array([t1,t2,t3,t4,t1,t3])

我尝试使用 intersect1d 和 unique,但无法找到一种方法来删除多次出现的所有三角形。我错过了什么?

这个确切的问题正是导致我创建numpy_indexed包的第一个动力:

import numpy_indexed as npi
npi.unique(triangles)

从那时起,它已经发展到涵盖了更多的东西。而且,从那时起,numpy 为唯一添加了轴参数

np.unique(triangles, axis=0)

应该完成同样的事情,执行基本相同的底层操作。 npi.unique也有一个轴参数,但默认情况下为0。

假设顶点的顺序无关紧要,您可以先对顶点进行排序,然后使用类似的技术删除重复的三角形,如下所示: 从 NumPy 2D 数组中删除重复的列和行

def unique_triangles(points):
points = np.sort(points,axis=1)
unique_points = np.unique(points.flatten().view([('',points.dtype)]*points.shape[1]*points.shape[2]))
return unique_points.view(points.dtype).reshape((-1,points.shape[1],points.shape[2]))

例:

>>> unique_triangles(points)
array([[[-2, -2,  0],
[ 1, -2,  0],
[ 1,  1,  0]],
[[-2, -2,  1],
[ 1, -2,  1],
[ 1,  1,  1]],
[[ 1,  1,  0],
[-2,  1,  0],
[-2, -2,  0]],
[[ 1,  1,  1],
[-2,  1,  1],
[-2, -2,  1]]])

一个解决方案是构建一组三角形,为此,必须首先对每个三角形的点进行排序:

# Some points
a=(-2,-2,0)
b=(1,-2,0)
c=(1, 1,0)
d=(-2,1,0)
e=(-2,-2,1)
f=(1,-2,1)
g=(1,1,1)
h=(-2,1,1)
# Some triangles
t1=(a,b,c)
t2=(c,d,a)
t3=(e,f,g)
t4=(g,h,e)
# The numpy array with duplicated t1 and t3
triangles = [t1,t2,t3,t4,t1,t3]
set( tuple(sorted(points)) for points in triangles )

给:

{((-2, -2, 0), (-2, 1, 0), (1, 1, 0)),
((-2, -2, 0), (1, -2, 0), (1, 1, 0)),
((-2, -2, 1), (-2, 1, 1), (1, 1, 1)),
((-2, -2, 1), (1, -2, 1), (1, 1, 1))}

相关内容

  • 没有找到相关文章

最新更新