有效地从STL文件生成拓扑

Efficiently generating a topology from an STL file

本文关键字:文件 STL 有效地      更新时间:2023-10-16

我有一个可打印的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));
    }
};

当我构造facet列表时,我将所有顶点推入一个unordered_set,然后将该集合复制到一个向量中。对顶点的引用存储在facet对象中,这允许我基于邻近的facet进行搜索。

这段代码的运行速度也比我想要的慢。我的问题是如何在我的面之间更快地创建拓扑关系?

您应该查看为3D最近邻搜索优化的数据结构。以下是最受欢迎的:

  • 二进制空间划分(BSP)和k-d树
  • 位置敏感散列(LSH)
  • r - tree