vcg.tri.HalfEdgeTopology

vcg.tri.HalfEdgeTopology是一个半边数据结构,用于描述三维网格的拓扑结构。它提供了一个高效的方法来遍历三角形、边和顶点之间的关系。

属性:

  • vert:一个指向vert数组的指针,包含了所有的顶点。
  • face:一个指向face数组的指针,包含了所有的三角形面。
  • edge:一个指向边数组的指针,包含了所有的边。
  • he:一个指向半边数组的指针。
  • vertNum:顶点数量。
  • faceNum:三角形数量。
  • edgeNum:边数量。
  • reserved:预留字段。

方法:

  • HalfEdgeTopology():构造函数。
  • ~HalfEdgeTopology():析构函数。
  • init(const vcg::tri::TopologyBase<MeshType>& m):初始化函数,用于从另一个拓扑结构中复制数据。
  • init(const MeshType& m):另一个初始化函数,用于从另一个网格拓扑结构中复制数据。
  • Build():构建半边数据结构。
  • validate():检查数据结构的一致性。
  • getFacePointers(FaceType* const ptrs) const:获取三角形指针数组。
  • getVertexPointers(VertexType* const ptrs) const:获取顶点指针数组。
  • getEdgePointers(EdgeType* const ptrs) const:获取边指针数组。
  • MoveVertices(std::vector<int>& mapping):移动顶点位置。
  • GetOutgoingHalfEdge(const EdgeType* const edge, const VertexType* const vertex) const:获取给定顶点下的另一条半边。
  • GetNextHalfEdge(const HalfEdgeType* const he) const:获取与给定半边相邻的下一条半边。
  • GetPrevHalfEdge(const HalfEdgeType* const he) const:获取与给定半边相邻的上一条半边。
  • GetOpposite(const HalfEdgeType* const he) const:获取与给定半边相反的半边。
  • GetFace(const HalfEdgeType* const he) const:获取给定半边所在的三角形面。
  • GetVertex(const HalfEdgeType* const he) const:获取给定半边所在的顶点。
  • GetPrev(const HalfEdgeType* const he) const:获取与给定半边相邻的顶点上的上一条半边。
  • GetNext(const HalfEdgeType* const he) const:获取与给定半边相邻的顶点上的下一条半边。
  • GetLastIncoming(const VertexType* const vertex, const FaceType* const face) const:获取给定面上相邻的前一条半边。

示例代码:

#include <vcg/complex/complex.h>
#include <vcg/complex/algorithms/clean.h>
#include <vcg/complex/algorithms/update/topology.h>

using namespace vcg;

class MyVertex;
class MyEdge;
class MyFace;

struct MyUsedTypes : public UsedTypes<Use<MyVertex>::AsVertexType, Use<MyEdge>::AsEdgeType, Use<MyFace>::AsFaceType>{};

class MyVertex : public Vertex<MyUsedTypes, vertex::Coord3f, vertex::Normal3f, vertex::Qualityf, vertex::BitFlags>{};

class MyEdge : public Edge<MyUsedTypes>{};

class MyFace : public Face<MyUsedTypes, face::VertexRef, face::BitFlags>{};

class MyMesh : public vcg::tri::TriMesh<std::vector<MyVertex>, std::vector<MyFace>> {};

int main () {
  MyMesh mesh;
  tri::BuildBox(mesh, 2, 2, 2);
  tri::Clean<MyMesh>::RemoveDuplicateVertex(mesh);
  tri::UpdateTopology<MyMesh>::FaceFace(mesh);
  
  vcg::tri::HalfEdgeTopology<MyMesh> he_Topology(mesh);
  he_Topology.Build();
  
  // 遍历顶点
  for(CVertexIterator vi(mesh); !vi.End(); ++vi) {
      MyVertex *v = &*vi;
      auto he = he_Topology.vertEE(*v);
      do {
        /* 遍历当前顶点所在的半边 */
        he = he_Topology.vertEE(*v, he);
      } while(he != nullptr);
  }
  
  // 遍历面
  for(CFaceIterator fi(mesh); !fi.End(); ++fi) {
    MyFace *f = &*fi;
    auto e = he_Topology.faceEE(*f);
    do {
        /* 遍历当前面所在的半边 */
        e = he_Topology.faceEE(*f, e);
    } while(e != nullptr);
  }
  
  return 0;
}