编辑:想知道我有哪种类型的网格:
想象一下一个乐高砖,顶部有四个旋钮。我读了一个包含整个砖块表面的STL文件。在识别了所有具有唯一坐标的节点(并将它们的下一个邻居保存在列表中)之后,我将大部分的节点剪掉,这样只剩下四个旋钮。不幸的是,这四个旋钮仍然在一个大列表中(一个用于节点,一个用于下一个邻居)。如果我指定一个属于这个旋钮的节点,我想要最快的方法得到所有的一个旋钮。
我有一个(相对)大的List<cNode> nodes
class cNode
{
int nodeNumber;
cVector vector;
}还有一个更大的(约14e6条目) List<cNodeCoincidence> coincidences
class cNodeCoincidence
{
cNode node1;
cNode node2;
}我的节点表示3D中的点,我的巧合类似于以前由三角形组成的网格,由STL文件浓缩而成。我知道一个事实(并且用户做出了相应的输入),我的节点网格实际上是一个节点/巧合列表中的4个单独的网格。我的目标是将每个子网格的节点提取到自己的节点列表中。为了实现这一点,我从每个子网格的一个节点开始,我知道它是上述子网格的一部分。提示递归函数:
private void AssembleSubMesh(ReadOnlyCollection<cNode> in_nodesToRead, List<cNode> in_nodesAlreadyRead)
{
List<cNode> newNodesToRead = new List<cNode>();
List<cNodeCoincidence> foundCoincidences = coincidences.Where(x => (in_nodesToRead.Any(y => y == x.node1)) || in_nodesToRead.Any(z => z == x.node2)).ToList();
in_nodesAlreadyRead.AddRange(in_nodesToRead);
List<cNode> allRemainingNodes = new List<cNode>();
foreach (cNodeCoincidence nc in foundCoincidences)
{
allRemainingNodes.Add(nc.node1);
allRemainingNodes.Add(nc.node2);
}
allRemainingNodes = allRemainingNodes.Distinct().ToList();
allRemainingNodes.RemoveAll(x => in_nodesAlreadyRead.Contains(x));
if (allRemainingNodes.Count != 0)
AssembleSubMesh(new ReadOnlyCollection<cNode>(allRemainingNodes), in_nodesAlreadyRead);
}它由:AssembleSubMesh(new ReadOnlyCollection<cNode>(firstNodeIKnow), globalResultListForSubmesh);调用,从而将递归的结果写入一个更全局的列表。
这个程序可以工作(用小网格测试),但速度慢得令人痛苦(在我中止这个过程之前的15小时以上)。
有什么方法可以更快、更优雅地分离网格吗?
我找到了这是如此的帖子并查看了一下这次讲座,似乎这可能是我所需要的(特别是WQUPC),但我不知道它到底有什么用,因为他们只有一个节点列表,而我还有一个巧合列表--如果不使用它,这将是一种遗憾,真的(?)
数据库能帮助(因为索引)吗?
发布于 2014-12-05 14:49:49
你需要能够识别边缘。它是两个顶点之间的一个单一连接(没有找到其他连接)。我假设所有三角形都有顶点,所以它们是重复的。这取决于您的网格的尺寸确定,但它不应该花这么多时间。
您需要定义字典,这将泵入您的应用程序的内存,但也将大大提高速度与保证O(1)访问。
简言之:
1)负载数据
2)扫描并构造适当的数据结构--如果你观察到任何CAD建模软件,那么在网格加载过程中需要花费更多的时间,因为同样的原因:它们需要扫描加载的数据,并构造适当的数据结构,以便能够尽可能快地处理这些数据。
3)使用这些数据结构尽可能快地获取所需的信息。
因此,明智地选择数据结构和键,以满足应用程序的需求。
https://stackoverflow.com/questions/27318002
复制相似问题