Computational Geometry Algorithms Library  1.0
Computational Geometry Algorithms Library Documentation
HalfEdgeList.h
Go to the documentation of this file.
1 #include "DCELHalfEdge.h"
2 #include "DCELVertex.h"
3 #include "FaceList.h"
4 
5 
6 using namespace std;
8 {
9 public:
10  HalfEdgeList(void);
11  ~HalfEdgeList(void);
12 
16 
17  void addToList(DCELHalfEdge* newEdge);
18  void removeFromList(DCELHalfEdge* edge);
19  DCELHalfEdge* addTwinTo(DCELHalfEdge* edge, DCELHalfEdge* LaggingTwin);
20  DCELFace* addEdgeBetween(DCELVertex* v1, DCELVertex* v2, DCELFace* face);
21 protected:
22  bool status;
23 };
24 
25 HalfEdgeList::HalfEdgeList(void) : globalEdgeCount(0), head(NULL), tail(NULL), status(false)
26 {
27 }
28 
30 {
31 }
32 
34 {
35  newEdge->meta = ++globalEdgeCount;
36 
37  if (head)
38  {
39  tail->next = newEdge;
40  tail = newEdge;
41  }
42  else {
43  head = newEdge;
44  tail = newEdge;
45  }
46 }
48 
52  DCELHalfEdge *twinEdge = new DCELHalfEdge();
53  twinEdge->meta = ++globalEdgeCount;
54  twinEdge->twin = edge;
55  if (LaggingTwin) {
56  LaggingTwin->origin = twinEdge->twin->origin;
57  twinEdge->next = LaggingTwin;
58  }
59  edge->twin = twinEdge;
60  return twinEdge;
61 }
62 
64 {
65  edge->getPrev()->next = edge->twin->next;
66  edge->twin->getPrev()->next = edge->next;
67  delete edge->twin;
68  delete edge;
69 }
71 
76 {
77  DCELHalfEdge* walker = face->edge;
78  while (1) {
79  if (walker->next->origin == v1)
80  break;
81  walker = walker->next;
82  }
83 
84  DCELHalfEdge* halfEdge = new DCELHalfEdge();
85  halfEdge->origin = v2;
86  halfEdge->meta = ++globalEdgeCount;
87  halfEdge->next = walker->next;
88 
89  DCELHalfEdge* twinWalker = face->edge;
90  while (1) {
91  if (twinWalker->next->origin == v2)
92  break;
93  twinWalker = twinWalker->next;
94  }
95 
96  DCELHalfEdge* twinEdge = new DCELHalfEdge();
97  twinEdge->origin = v1;
98  twinEdge->meta = ++globalEdgeCount;
99  twinEdge->next = twinWalker->next;
100 
101  walker->next = twinEdge;
102  twinWalker->next = halfEdge;
103 
104  halfEdge->twin = twinEdge;
105  twinEdge->twin = halfEdge;
106 
107 
108  DCELFace* firstHalf = new DCELFace();
109  firstHalf->edge = halfEdge;
110  walker = halfEdge;
111  do {
112  walker->face = firstHalf;
113  walker = walker->next;
114  } while(walker != halfEdge);
115 
116  DCELFace* secHalf = new DCELFace();
117  secHalf->edge = twinEdge;
118  twinEdge->face = secHalf;
119  walker = twinEdge;
120  do {
121  walker->face = secHalf;
122  walker = walker->next;
123  } while(walker != twinEdge);
124 
125  secHalf->next = firstHalf;
126  return secHalf;
127 }
128 
DCELHalfEdge * twin
Definition: DCELHalfEdge.h:14
void addToList(DCELHalfEdge *newEdge)
Definition: HalfEdgeList.h:33
DCELHalfEdge * next
Definition: DCELHalfEdge.h:15
Definition: HalfEdgeList.h:7
~HalfEdgeList(void)
Definition: HalfEdgeList.h:29
Definition: DCELFace.h:1
void removeFromList(DCELHalfEdge *edge)
Definition: HalfEdgeList.h:63
DCELVertex * origin
Definition: DCELHalfEdge.h:17
HalfEdgeList(void)
Definition: HalfEdgeList.h:25
DCELHalfEdge * head
Definition: HalfEdgeList.h:13
DCELFace * face
Definition: DCELHalfEdge.h:16
DCELFace * next
Definition: DCELFace.h:9
Definition: DCELVertex.h:2
DCELHalfEdge * getPrev()
Half Edges.
Definition: DCELHalfEdge.h:36
DCELHalfEdge * tail
Definition: HalfEdgeList.h:14
DCELHalfEdge * addTwinTo(DCELHalfEdge *edge, DCELHalfEdge *LaggingTwin)
GETTTING THE HALF EDGE LIST.
Definition: HalfEdgeList.h:51
bool status
Definition: HalfEdgeList.h:22
DCELFace * addEdgeBetween(DCELVertex *v1, DCELVertex *v2, DCELFace *face)
GETTTING THE HALF EDGE LIST.
Definition: HalfEdgeList.h:75
int globalEdgeCount
Definition: HalfEdgeList.h:15
Definition: DCELHalfEdge.h:8
int meta
Definition: DCELHalfEdge.h:20
DCELHalfEdge * edge
Definition: DCELFace.h:7