首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列表/网格划分为子列表/子网格。

将列表/网格划分为子列表/子网格。
EN

Stack Overflow用户
提问于 2014-12-05 14:23:47
回答 1查看 114关注 0票数 0

编辑:想知道我有哪种类型的网格:

想象一下一个乐高砖,顶部有四个旋钮。我读了一个包含整个砖块表面的STL文件。在识别了所有具有唯一坐标的节点(并将它们的下一个邻居保存在列表中)之后,我将大部分的节点剪掉,这样只剩下四个旋钮。不幸的是,这四个旋钮仍然在一个大列表中(一个用于节点,一个用于下一个邻居)。如果我指定一个属于这个旋钮的节点,我想要最快的方法得到所有的一个旋钮。

我有一个(相对)大的List<cNode> nodes

代码语言:javascript
复制
class cNode
{
    int nodeNumber;
    cVector vector;
}

还有一个更大的(约14e6条目) List<cNodeCoincidence> coincidences

代码语言:javascript
复制
class cNodeCoincidence
{
    cNode node1;
    cNode node2;
}

我的节点表示3D中的点,我的巧合类似于以前由三角形组成的网格,由STL文件浓缩而成。我知道一个事实(并且用户做出了相应的输入),我的节点网格实际上是一个节点/巧合列表中的4个单独的网格。我的目标是将每个子网格的节点提取到自己的节点列表中。为了实现这一点,我从每个子网格的一个节点开始,我知道它是上述子网格的一部分。提示递归函数:

代码语言:javascript
复制
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),但我不知道它到底有什么用,因为他们只有一个节点列表,而我还有一个巧合列表--如果不使用它,这将是一种遗憾,真的(?)

数据库能帮助(因为索引)吗?

EN

回答 1

Stack Overflow用户

发布于 2014-12-05 14:49:49

你需要能够识别边缘。它是两个顶点之间的一个单一连接(没有找到其他连接)。我假设所有三角形都有顶点,所以它们是重复的。这取决于您的网格的尺寸确定,但它不应该花这么多时间。

您需要定义字典,这将泵入您的应用程序的内存,但也将大大提高速度与保证O(1)访问。

简言之:

1)负载数据

2)扫描并构造适当的数据结构--如果你观察到任何CAD建模软件,那么在网格加载过程中需要花费更多的时间,因为同样的原因:它们需要扫描加载的数据,并构造适当的数据结构,以便能够尽可能快地处理这些数据。

3)使用这些数据结构尽可能快地获取所需的信息。

因此,明智地选择数据结构和键,以满足应用程序的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27318002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档