Computational Geometry Algorithms Library  1.0
Computational Geometry Algorithms Library Documentation
monotone.h
Go to the documentation of this file.
1 #include <iostream>
2 #include "origin.h"
3 using namespace std;
4 #define REGULAR_VERTEX 0
5 #define START_VERTEX 1
6 #define END_VERTEX 2
7 #define MERGE_VERTEX 3
8 #define SPLIT_VERTEX 4
9 #define COLLINEAR 1
10 #define CLOCKWISE 2
11 #define ANTICLOCKWISE 3
12 class func {
13 public:
14  bool operator() (DCELHalfEdge* e1, DCELHalfEdge* e2) {
15  return e1->origin->y < e2->origin->y;
16  }
17 };
18 set<DCELHalfEdge *, func>tree;
19 
20 int vlen;
22 
27  double dif;
28  dif = (b->y - a->y) * (c->x - b->x) - (b->x - a->x) * (c->y - b->y);
29  if (dif == 0) {
30  return COLLINEAR;
31  } else if (dif > 0 ) {
32  return CLOCKWISE;
33  } else {
34  return ANTICLOCKWISE;
35  }
36 }
38 
41 bool below(DCELVertex* v1, DCELVertex* v2) {
42  if (v1->y != v2->y)
43  return v1->y > v2->y;
44  else
45  return v1->x < v2->x;
46 }
47 bool left_edgeto_vertex(const DCELHalfEdge* e1, const DCELHalfEdge* e2) {
48  return (e1->origin->y > e2->origin->y) && (e1->origin->x < e2->origin->x);
49 }
50 
52 
58  for (int i = 0; i < vlen; i++) {
59  if (below(v, v->edge->twin->origin) && below(v, v->edge->getPrev()->origin)) {
60  if (orientation(v->edge->twin->origin, v, v->edge->getPrev()->origin) == CLOCKWISE)
61  v->type = START_VERTEX;
62  else
63  v->type = SPLIT_VERTEX;
64  }
65  else if (below(v->edge->twin->origin, v) && below(v->edge->getPrev()->origin, v)) {
66  if (orientation(v->edge->twin->origin, v, v->edge->getPrev()->origin) == CLOCKWISE)
67  v->type = END_VERTEX;
68  else
69  v->type = MERGE_VERTEX;
70  }
71  else
72  v->type = REGULAR_VERTEX;
73 
74  v = v->next;
75  }
76 }
78 
82  tree.insert(v->edge);
83  v->edge->helper = v;
84 }
86 
90  if (v->edge->getPrev()->helper)
91  if (v->edge->getPrev()->helper->type == MERGE_VERTEX) {
92  insertDiagonal(v, v->edge->getPrev()->helper);
93  }
94  tree.erase(v->edge->getPrev());
95 }
96 
98  set<DCELHalfEdge *, func>::iterator it;
99  it = std::lower_bound(tree.begin(), tree.end(), v->edge, left_edgeto_vertex);
100  if (it != tree.begin()) {
101  it--;
102  }
103  DCELHalfEdge *s = *it;
104  insertDiagonal(v, s->helper);
105  s->helper = v;
106  tree.insert(v->edge);
107  v->edge->helper = v;
108 }
109 
111  if (v->edge->getPrev()->helper)
112  if (v->edge->getPrev()->helper->type == MERGE_VERTEX) {
113  insertDiagonal(v, v->edge->getPrev()->helper);
114  }
115  tree.erase(v->edge->getPrev());
116  set<DCELHalfEdge *, func>::iterator it;
117  it = std::lower_bound(tree.begin(), tree.end(), v->edge, left_edgeto_vertex);
118  if (it != tree.begin()) {
119  it--;
120  }
121  DCELHalfEdge *s = *it;
122  if (s->helper)
123  if (s->helper->type == MERGE_VERTEX) {
124  insertDiagonal(v, s->helper);
125  }
126  s->helper = v;
127 }
128 
130  if (below(v, v->edge->twin->origin)) {
131  if (v->edge->getPrev()->helper->type == MERGE_VERTEX) {
132  insertDiagonal(v, v->edge->getPrev()->helper);
133  }
134  tree.erase(v->edge->getPrev());
135  tree.insert(v->edge);
136  v->edge->helper = v;
137  }
138  else {
139  set<DCELHalfEdge *, func>::iterator it;
140  it = std::lower_bound(tree.begin(), tree.end(), v->edge, left_edgeto_vertex);
141  if (it != tree.begin()) {
142  it--;
143  }
144  DCELHalfEdge *s = *it;
145  if (s->helper->type == MERGE_VERTEX) {
146  insertDiagonal(v, s->helper);
147  }
148  s->helper = v;
149  }
150 }
152 
158  DCELVertex *v = Vertices.head;
159  int i = 0;
160  while (v) {
161  if (v->type == START_VERTEX) HANDLE_START_VERTEX(v);
162  else if (v->type == SPLIT_VERTEX) HANDLE_SPLIT_VERTEX(v);
163  else if (v->type == END_VERTEX) HANDLE_END_VERTEX(v);
164  else if (v->type == MERGE_VERTEX) HANDLE_MERGE_VERTEX(v);
165  else if (v->type == REGULAR_VERTEX) HANDLE_REGULAR_VERTEX(v);
166  v = v->next;
167  }
168 }
int type
Definition: DCELVertex.h:15
DCELHalfEdge * edge
Definition: DCELVertex.h:10
DCELHalfEdge * twin
Definition: DCELHalfEdge.h:14
int orientation(DCELVertex *a, DCELVertex *b, DCELVertex *c)
Orientation.
Definition: monotone.h:26
VertexList Vertices
Definition: origin.h:13
#define START_VERTEX
Definition: monotone.h:5
DCELVertex * origin
Definition: DCELHalfEdge.h:17
void HANDLE_REGULAR_VERTEX(DCELVertex *v)
Definition: monotone.h:129
void insertDiagonal(DCELVertex *v1, DCELVertex *v2)
Definition: origin.h:105
bool below(DCELVertex *v1, DCELVertex *v2)
Bool Check Below.
Definition: monotone.h:41
void form_vertex_type()
form_vertex_type
Definition: monotone.h:55
void HANDLE_SPLIT_VERTEX(DCELVertex *v)
Definition: monotone.h:97
#define END_VERTEX
Definition: monotone.h:6
int vlen
Definition: monotone.h:20
Definition: DCELVertex.h:2
#define SPLIT_VERTEX
Definition: monotone.h:8
void split_into_monotone()
VERTEX HANDLING.
Definition: monotone.h:156
DCELHalfEdge * getPrev()
Half Edges.
Definition: DCELHalfEdge.h:36
#define COLLINEAR
Definition: monotone.h:9
DCELVertex * helper
Definition: DCELHalfEdge.h:18
double x
Definition: DCELVertex.h:8
#define REGULAR_VERTEX
Definition: monotone.h:4
#define MERGE_VERTEX
Definition: monotone.h:7
int length
Definition: VertexList.h:13
double y
Definition: DCELVertex.h:9
void HANDLE_END_VERTEX(DCELVertex *v)
VERTEX HANDLING.
Definition: monotone.h:89
#define CLOCKWISE
Definition: monotone.h:10
bool left_edgeto_vertex(const DCELHalfEdge *e1, const DCELHalfEdge *e2)
Definition: monotone.h:47
void HANDLE_START_VERTEX(DCELVertex *v)
form_vertex_type
Definition: monotone.h:81
#define ANTICLOCKWISE
Definition: monotone.h:11
set< DCELHalfEdge *, func > tree
Definition: monotone.h:18
Definition: DCELHalfEdge.h:8
DCELVertex * next
Definition: DCELVertex.h:18
void HANDLE_MERGE_VERTEX(DCELVertex *v)
Definition: monotone.h:110
DCELVertex * head
Definition: VertexList.h:9