C#:删除链接到索引的重复点3D的最快方法

时间:2015-04-04 11:51:05

标签: c# algorithm duplicates

抱歉我的英语不好。

使用MeshGeometry3D时,必须指定:

  • MeshGeometry3D.Positions:Point3D的集合
  • MeshGeometry3D.TriangleIndices:int
  • 的集合

TriangleIndices中的每个指数都指向位置中的Point3D。 TriangleIndices.Count是3的倍数,因为你必须指定三角形索引(所以3个索引是三角形)。

斗争是:在“位置”中,如果您放置它们而不检查位置是否已存在,则可以有重复点。
enter image description here

在这里你可以看到Positions [2]和Positions [3]是等于 如果您有1个或2个三角形,那就没问题。但如果您有20000个三角形,则可能浪费空间+处理大型集合需要更长时间(添加项目需要更长时间,获取项目,删除项目......)。 因此,解决方案是在位置中删除重复的Point3D。但是如果你这样做,你必须改变TriangleIndices中的索引。如果我以我的先例为例,这将给出:
enter image description here

删除位置中重复项的一种方法是使用Distinct()。 但如果我使用它,我不知道他删除了重复项的位置,因此我无法修改TriangleIndices集合。
另一种方法是:当我在Positions中添加Point3D时,我检查Collection中是否存在Point3D(添加),如果是,我不添加它,我在TriangleIndices中添加现有Point3D的索引。但它要求我使用速度慢的IndexOf ......真的很慢。

所以我的问题是:你知道删除与索引相关的重复Point3D的最快方法吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

MeshGeometry3D类使用一组Positions,Normals和TriangleIndicies定义。根据定义,这三个列表具有相同的尺寸。

如果需要节省空间,可以创建一个不重复的位置列表和一个int列表,以存储每个方面对它们的所有引用。