www.pudn.com > View3D.zip > HE_mesh.h


#ifndef HE_MESH_H
#define HE_MESH_H

#include "linklist.h"
#include "GA_lib.h"
#include "GA_math.h"

#include 
#include 
using namespace std;

#define EDGE_NO_REVERSE 1000

class HE_Vert;
class HE_HalfEdge;
class HE_Face;

class HE_Vert{
 public:
  int index;
  int flag;
  float co[3];
  float no[3];
  float gauss_cur;
  HE_HalfEdge * outedge;

  HE_Vert *next,*prev;
 public:
  HE_Vert(){
    index = -1;
    co[0] = co[1] = co[2] = 0.0;
    no[0] = no[1] = no[2] = 0.0;
    gauss_cur = 0.0;
    outedge = NULL;

    next = NULL;
    prev = NULL;
  }
};

class HE_HalfEdge{
 public:
  int index;
  int flag;
  float length;
  HE_Vert * start;
  HE_HalfEdge * reverse;
  HE_HalfEdge * nextedge;
  HE_Face * face;
  
  HE_HalfEdge *next,*prev;
 public:
  HE_HalfEdge(){
    length = 0.0;
    index = -1;
    start = NULL;
    reverse = NULL;
    nextedge = NULL;
    face = NULL;
    next = NULL;
    prev = NULL;
  }
};

class HE_Face{
 public:
  int index;
  int flag;
  float no[3];
  HE_HalfEdge * edge;
  
  HE_Face *prev,*next;
 public:
  HE_Face(){
    index = -1;
    no[0] = no[1] = no[2] = 0.0;
    edge = NULL;
    prev = NULL;
    next = NULL;
  }
};

class HE_Mesh{
 public:
  LinkList verts;
  LinkList edges;
  LinkList faces;
  float center[3];
 public:
  int LoadWaveFrontObj(char * filename);
  int MoveToCenter();

  vector VSurroundVertices(HE_Vert * vpos);
  vector VSurroundEdges(HE_Vert * vpos);
  int Gauss_Curvature(HE_Vert* vpos);
  int Gauss_CurvatureAll();

  int CalcEdgeLength(HE_HalfEdge * epos);
  int CalcAllEdgeLength();

  int GetReverseEdge();
  int PM_CollapseEdge(HE_HalfEdge * epos);
  int PM_CanCollapse(HE_HalfEdge * epos);
  HE_HalfEdge * PM_SelectEdge();
  int PM_Simplify();

  int FCalculateNormFace(HE_Face * fpos);
  int FCalculateNormAllFace();
  vector FSurroundVertices(HE_Face * fpos);
};

#endif