Computational Geometry Algorithms Library  1.0
Computational Geometry Algorithms Library Documentation
Classes | Macros | Functions | Variables
monotone.h File Reference
#include <iostream>
#include "origin.h"
Include dependency graph for monotone.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  func
 

Macros

#define REGULAR_VERTEX   0
 
#define START_VERTEX   1
 
#define END_VERTEX   2
 
#define MERGE_VERTEX   3
 
#define SPLIT_VERTEX   4
 
#define COLLINEAR   1
 
#define CLOCKWISE   2
 
#define ANTICLOCKWISE   3
 

Functions

int orientation (DCELVertex *a, DCELVertex *b, DCELVertex *c)
 Orientation. More...
 
bool below (DCELVertex *v1, DCELVertex *v2)
 Bool Check Below. More...
 
bool left_edgeto_vertex (const DCELHalfEdge *e1, const DCELHalfEdge *e2)
 
void form_vertex_type ()
 form_vertex_type More...
 
void HANDLE_START_VERTEX (DCELVertex *v)
 form_vertex_type More...
 
void HANDLE_END_VERTEX (DCELVertex *v)
 VERTEX HANDLING. More...
 
void HANDLE_SPLIT_VERTEX (DCELVertex *v)
 
void HANDLE_MERGE_VERTEX (DCELVertex *v)
 
void HANDLE_REGULAR_VERTEX (DCELVertex *v)
 
void split_into_monotone ()
 VERTEX HANDLING. More...
 

Variables

set< DCELHalfEdge *, functree
 
int vlen
 

Macro Definition Documentation

#define ANTICLOCKWISE   3

Macro defined for identifying 3 points that rotate anticlockwise

#define CLOCKWISE   2

Macro defined for identifying 3 points that rotate clockwise

#define COLLINEAR   1

Macro defined for identifying 3 collinear points

#define END_VERTEX   2
#define MERGE_VERTEX   3
#define REGULAR_VERTEX   0
#define SPLIT_VERTEX   4
#define START_VERTEX   1

Function Documentation

bool below ( DCELVertex v1,
DCELVertex v2 
)

Bool Check Below.

Check the location of the two DCEL Vertices

41  {
42  if (v1->y != v2->y)
43  return v1->y > v2->y;
44  else
45  return v1->x < v2->x;
46 }
double x
Definition: DCELVertex.h:8
double y
Definition: DCELVertex.h:9
void form_vertex_type ( )

form_vertex_type

Check whether START_VERTEX, SPLIT_VERTEX, MERGE_VERTEX, REGULAR_VERTEX

55  {
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 }
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
bool below(DCELVertex *v1, DCELVertex *v2)
Bool Check Below.
Definition: monotone.h:41
#define END_VERTEX
Definition: monotone.h:6
int vlen
Definition: monotone.h:20
Definition: DCELVertex.h:2
#define SPLIT_VERTEX
Definition: monotone.h:8
DCELHalfEdge * getPrev()
Half Edges.
Definition: DCELHalfEdge.h:36
#define REGULAR_VERTEX
Definition: monotone.h:4
#define MERGE_VERTEX
Definition: monotone.h:7
int length
Definition: VertexList.h:13
#define CLOCKWISE
Definition: monotone.h:10
DCELVertex * next
Definition: DCELVertex.h:18
DCELVertex * head
Definition: VertexList.h:9
void HANDLE_END_VERTEX ( DCELVertex v)

VERTEX HANDLING.

Hepler For Handling End Vertex

89  {
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 }
int type
Definition: DCELVertex.h:15
DCELHalfEdge * edge
Definition: DCELVertex.h:10
void insertDiagonal(DCELVertex *v1, DCELVertex *v2)
Definition: origin.h:105
DCELHalfEdge * getPrev()
Half Edges.
Definition: DCELHalfEdge.h:36
DCELVertex * helper
Definition: DCELHalfEdge.h:18
#define MERGE_VERTEX
Definition: monotone.h:7
set< DCELHalfEdge *, func > tree
Definition: monotone.h:18
void HANDLE_MERGE_VERTEX ( DCELVertex v)
110  {
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 }
int type
Definition: DCELVertex.h:15
DCELHalfEdge * edge
Definition: DCELVertex.h:10
void insertDiagonal(DCELVertex *v1, DCELVertex *v2)
Definition: origin.h:105
DCELHalfEdge * getPrev()
Half Edges.
Definition: DCELHalfEdge.h:36
DCELVertex * helper
Definition: DCELHalfEdge.h:18
#define MERGE_VERTEX
Definition: monotone.h:7
bool left_edgeto_vertex(const DCELHalfEdge *e1, const DCELHalfEdge *e2)
Definition: monotone.h:47
set< DCELHalfEdge *, func > tree
Definition: monotone.h:18
Definition: DCELHalfEdge.h:8
void HANDLE_REGULAR_VERTEX ( DCELVertex v)
129  {
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 }
int type
Definition: DCELVertex.h:15
DCELHalfEdge * edge
Definition: DCELVertex.h:10
DCELHalfEdge * twin
Definition: DCELHalfEdge.h:14
DCELVertex * origin
Definition: DCELHalfEdge.h:17
void insertDiagonal(DCELVertex *v1, DCELVertex *v2)
Definition: origin.h:105
bool below(DCELVertex *v1, DCELVertex *v2)
Bool Check Below.
Definition: monotone.h:41
DCELHalfEdge * getPrev()
Half Edges.
Definition: DCELHalfEdge.h:36
DCELVertex * helper
Definition: DCELHalfEdge.h:18
#define MERGE_VERTEX
Definition: monotone.h:7
bool left_edgeto_vertex(const DCELHalfEdge *e1, const DCELHalfEdge *e2)
Definition: monotone.h:47
set< DCELHalfEdge *, func > tree
Definition: monotone.h:18
Definition: DCELHalfEdge.h:8
void HANDLE_SPLIT_VERTEX ( DCELVertex v)
97  {
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 }
DCELHalfEdge * edge
Definition: DCELVertex.h:10
void insertDiagonal(DCELVertex *v1, DCELVertex *v2)
Definition: origin.h:105
DCELVertex * helper
Definition: DCELHalfEdge.h:18
bool left_edgeto_vertex(const DCELHalfEdge *e1, const DCELHalfEdge *e2)
Definition: monotone.h:47
set< DCELHalfEdge *, func > tree
Definition: monotone.h:18
Definition: DCELHalfEdge.h:8
void HANDLE_START_VERTEX ( DCELVertex v)

form_vertex_type

Hepler For Handling STart Vertex

81  {
82  tree.insert(v->edge);
83  v->edge->helper = v;
84 }
DCELHalfEdge * edge
Definition: DCELVertex.h:10
DCELVertex * helper
Definition: DCELHalfEdge.h:18
set< DCELHalfEdge *, func > tree
Definition: monotone.h:18
bool left_edgeto_vertex ( const DCELHalfEdge e1,
const DCELHalfEdge e2 
)
47  {
48  return (e1->origin->y > e2->origin->y) && (e1->origin->x < e2->origin->x);
49 }
DCELVertex * origin
Definition: DCELHalfEdge.h:17
double x
Definition: DCELVertex.h:8
double y
Definition: DCELVertex.h:9
int orientation ( DCELVertex a,
DCELVertex b,
DCELVertex c 
)

Orientation.

This function is used to calculate orientation of 3 points namely clockwise, anticlockwise and collinear. The idea here is to to get the difference between slopes of 2 lines by assuming a particular direction as a result the result obtained determines the direction of turn of the three points.

26  {
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 }
#define COLLINEAR
Definition: monotone.h:9
double x
Definition: DCELVertex.h:8
double y
Definition: DCELVertex.h:9
#define CLOCKWISE
Definition: monotone.h:10
#define ANTICLOCKWISE
Definition: monotone.h:11
void split_into_monotone ( )

VERTEX HANDLING.

Splitting into montone pieces in the polygon

156  {
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
VertexList Vertices
Definition: origin.h:13
#define START_VERTEX
Definition: monotone.h:5
void HANDLE_REGULAR_VERTEX(DCELVertex *v)
Definition: monotone.h:129
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
Definition: DCELVertex.h:2
#define SPLIT_VERTEX
Definition: monotone.h:8
#define REGULAR_VERTEX
Definition: monotone.h:4
#define MERGE_VERTEX
Definition: monotone.h:7
void HANDLE_END_VERTEX(DCELVertex *v)
VERTEX HANDLING.
Definition: monotone.h:89
void HANDLE_START_VERTEX(DCELVertex *v)
form_vertex_type
Definition: monotone.h:81
DCELVertex * next
Definition: DCELVertex.h:18
void HANDLE_MERGE_VERTEX(DCELVertex *v)
Definition: monotone.h:110
DCELVertex * head
Definition: VertexList.h:9

Variable Documentation

set<DCELHalfEdge *, func> tree
int vlen