【发布时间】:2015-02-03 17:56:58
【问题描述】:
编辑:想知道我有什么类型的网格:
想象一下顶部有四个旋钮的乐高积木。我读了一个包含整块砖表面的 STL 文件。在用唯一坐标识别所有节点(并将它们的下一个邻居保存在列表中)之后,我切掉了大部分砖块,因此只剩下四个旋钮。对我来说不幸的是,这四个旋钮仍然在一个大列表中(一个用于节点,一个用于下一个邻居)。如果我指定一个我知道属于该旋钮的节点,我希望以最快的方式获取一个旋钮的所有节点。
我有一个(相对)大的List<cNode> nodes 在哪里
class cNode
{
int nodeNumber;
cVector vector;
}
还有一个更大的(约 14e6 个条目)List<cNodeCoincidence> coincidences where
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 小时)。
有没有什么方法可以更快更优雅地分离网格?
我找到了this SO post 并查看了this lecture,似乎这(尤其是 WQUPC)可能是我需要的,但我不明白它到底有什么帮助,因为他们只有一个节点列表,而我还有一个巧合列表,如果不使用会很遗憾,真的(?)。
数据库可以提供帮助吗(因为索引)?
【问题讨论】:
标签: c# performance algorithm mesh