快速提取规则立方体堆叠的外表面——基于VTK实现(一)

问题:多个立方体面靠面的堆叠在一起,如何提取其外表面。

比如两个并排的立方体,一共6+6=12个面,但是中间有两个面是在内部,如何识别出这两个面,并把他们去掉呢?

本文主要解决以下几个问题:

1. 如何实现立方体堆叠;

2. 如何清理重复顶点;

3. 如何清除内部面;

上代码

#include <vtkSmartPointer.h>
#include<vtkTriangleFilter.h>
#include<vtkCleanPolyData.h>
#include<unordered_set>
#include<set>

// 定义hash函数,用于删除重复的面,面的所有顶点id都一样,则认为是重复的面
size_t hash(std::set<int>& s)
{
    size_t result = 0;
    auto it = s.begin();
    for (; it != s.end(); it++)
    {
        if (it == s.begin())
            result = std::hash<int>()(*it);
        else
            result = result ^ std::hash<int>()(*it);
    }
    return result;
}

int main()
{
    // 要保证添加正方向顶点坐标的时候,是按照如下图所示顺序添加的
    //       0 --------- 1
    //      /|          /|
    //     2-+---------3 |
    //     | |         | |
    //     | 4---------+-5
    //     |/          |/
    //     6-----------7
    int cube_ids[6][4] = { {0,