Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef _triangulate_h
#define _triangulate_h
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct {
double x, y;
} point_t, vector_t;
/* Segment attributes */
typedef struct {
point_t v0, v1; /* two endpoints */
int is_inserted; /* inserted in trapezoidation yet ? */
int root0, root1; /* root nodes in Q */
int next; /* Next logical segment */
int prev; /* Previous segment */
} segment_t;
/* Trapezoid attributes */
typedef struct {
int lseg, rseg; /* two adjoining segments */
point_t hi, lo; /* max/min y-values */
int u0, u1;
int d0, d1;
int sink; /* pointer to corresponding in Q */
int usave, uside; /* I forgot what this means */
int state;
} trap_t;
/* Node attributes for every node in the query structure */
typedef struct {
int nodetype; /* Y-node or S-node */
int segnum;
point_t yval;
int trnum;
int parent; /* doubly linked DAG */
int left, right; /* children */
} node_t;
typedef struct {
int vnum;
int next; /* Circularly linked list */
int prev; /* describing the monotone */
int marked; /* polygon */
} monchain_t;
typedef struct {
point_t pt;
int vnext[4]; /* next vertices for the 4 chains */
int vpos[4]; /* position of v in the 4 chains */
int nextfree;
} vertexchain_t;
/* Node types */
#define T_X 1
#define T_Y 2
#define T_SINK 3
#define SEGSIZE 200 /* max# of segments. Determines how */
/* many points can be specified as */
/* input. If your datasets have large */
/* number of points, increase this */
/* value accordingly. */
#define QSIZE 8*SEGSIZE /* maximum table sizes */
#define TRSIZE 4*SEGSIZE /* max# trapezoids */
#define TRUE 1
#define FALSE 0
#define FIRSTPT 1 /* checking whether pt. is inserted */
#define LASTPT 2
philippe.verley_ird.fr
committed
/* #define INFINITY 1<<30 */
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#define C_EPS 1.0e-7 /* tolerance value: Used for making */
/* all decisions about collinearity or */
/* left/right of segment. Decrease */
/* this value if the input points are */
/* spaced very close together */
#define S_LEFT 1 /* for merge-direction */
#define S_RIGHT 2
#define ST_VALID 1 /* for trapezium state */
#define ST_INVALID 2
#define SP_SIMPLE_LRUP 1 /* for splitting trapezoids */
#define SP_SIMPLE_LRDN 2
#define SP_2UP_2DN 3
#define SP_2UP_LEFT 4
#define SP_2UP_RIGHT 5
#define SP_2DN_LEFT 6
#define SP_2DN_RIGHT 7
#define SP_NOSPLIT -1
#define TR_FROM_UP 1 /* for traverse-direction */
#define TR_FROM_DN 2
#define TRI_LHS 1
#define TRI_RHS 2
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define CROSS(v0, v1, v2) (((v1).x - (v0).x)*((v2).y - (v0).y) - \
((v1).y - (v0).y)*((v2).x - (v0).x))
#define DOT(v0, v1) ((v0).x * (v1).x + (v0).y * (v1).y)
#define FP_EQUAL(s, t) (fabs(s - t) <= C_EPS)
#define TRUE 1
#define FALSE 0
/* Global variables */
extern node_t qs[QSIZE]; /* Query structure */
extern trap_t tr[TRSIZE]; /* Trapezoid structure */
extern segment_t seg[SEGSIZE]; /* Segment table */
philippe.verley_ird.fr
committed
philippe.verley_ird.fr
committed
extern int triangulate_polygon(int, int *, double**,int**);
philippe.verley_ird.fr
committed
int triangulate_polygon(int, int [], double**, int**);
philippe.verley_ird.fr
committed
int testclock(double *,double *,int);
philippe.verley_ird.fr
committed
extern int monotonate_trapezoids(int);
extern int triangulate_monotone_polygons(int, int, int**);
philippe.verley_ird.fr
committed
extern int _greater_than(point_t *, point_t *);
extern int _equal_to(point_t *, point_t *);
extern int _greater_than_equal_to(point_t *, point_t *);
extern int _less_than(point_t *, point_t *);
extern int locate_endpoint(point_t *, point_t *, int);
extern int construct_trapezoids(int);
philippe.verley_ird.fr
committed
extern int generate_random_ordering(int);
extern int choose_segment(void);
extern int read_segments(char *, int *);
extern int math_logstar_n(int);
extern int math_N(int, int);
philippe.verley_ird.fr
committed
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
int inside_polygon(trap_t *);
int newmon(void);
int new_chain_element(void);
double get_angle(point_t *, point_t *, point_t *);
int get_vertex_positions(int, int, int *, int *);
int make_new_monotone_poly(int, int, int);
/*int monotonate_trapezoids(int);*/
int traverse_polygon(int, int, int, int);
/*int triangulate_monotone_polygons(int, int, int **);*/
int triangulate_single_polygon(int, int, int, int **);
/*int choose_segment(int);
int math_logstar_n(int);
int math_N(int, int);*/
int newnode(void);
int newtrap(void);
int _max(point_t *, point_t *, point_t *);
int _min(point_t *, point_t *, point_t *);
/*int _greater_than(point_t *, point_t *);
int _equal_to(point_t *, point_t *);
int _greater_than_equal_to(point_t *, point_t *);
int _less_than(point_t *, point_t *);*/
int init_query_structure(int);
int is_left_of(int, point_t *);
int inserted(int, int);
/*int locate_endpoint(point_t *, point_t *, int);*/
int merge_trapezoids(int, int, int, int);
int add_segment(int);
int find_new_roots(int);
/*int construct_trapezoids(int);*/
int initialise(int);
/*int triangulate_polygon(int, int *, double **, int **);
int is_point_inside_polygon(double *);*/
philippe.verley_ird.fr
committed
/*static int triangulate_single_polygon(int, int, int, int**);*/
int triangulate_single_polygon(int, int, int, int**);
/*static int traverse_polygon(int, int, int, int);*/
int traverse_polygon(int, int, int, int);
philippe.verley_ird.fr
committed
#endif /* triangulate_h */