【问题标题】:Efficiently generating a topology from an STL file从 STL 文件有效地生成拓扑
【发布时间】:2016-10-04 21:49:41
【问题描述】:

我有一个用于可打印 3D 形状的 STL 文件。一个 STL 文件基本上是一个在 3 个空间中充满表示 3D 对象的面(带有法线的三角形)的包。每个面由 3 个顶点和一个法线表示。

使用哈希表,我匹配了所有等效的顶点,并使用该信息来提取拓扑模型,因此我可以请求关系船,例如 getNearbyFacets() 和 countNearbyFacets()。在对模型的切片进行轮廓绘制时,此信息非常重要。

这是我匹配顶点的方式:

//used to compare pointers to the vertex objects
struct lex_compare {
    bool operator() (CAMu3DPoint const* lhs, CAMu3DPoint const* rhs) const{
        return *lhs == *rhs;
    }
};

//hash function for the verticies
struct lex_hash{
    std::size_t operator()(CAMu3DPoint const* vert) const{
        return
            (std::hash<float>()(vert->x)) ^
            (std::hash<float>()(vert->y)) ^
            (std::hash<float>()(vert->z));
    }
};

当我构建分面列表时,我将所有顶点推入一个 unordered_set,然后将该集合复制到一个向量中。对顶点的引用存储在 facet 对象中,这使我可以根据相邻的 facet 进行搜索。

这段代码的运行速度也比我希望的要慢。我的问题是我怎样才能比这更快地在我的构面之间创建拓扑关系?

【问题讨论】:

  • 运行速度变慢了怎么办?
  • 为什么是哈希?您可以将浮点数作为整数进行比较,而不是应该更快。但是这里最慢的是列表操作,我在代码中的任何地方都看不到。按(任何)轴排序可能会有很大帮助
  • 没有列表操作。只是一个未指定顺序的方面列表。我想找出具有相同真实性的方面之间的关系。

标签: c++ graphics


【解决方案1】:

您应该了解针对 3D 最近邻搜索优化的数据结构。以下是最受欢迎的:

【讨论】:

  • 我最终使用了 boost::geometry::index::rtree
  • 太棒了!感谢您告知我们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多