5
5
*
6
6
* Copyright (c) 1994, Regents of the University of California
7
7
*
8
- * $Id: geo_decls.h,v 1.5 1997/06/03 14:10:32 thomas Exp $
8
+ * $Id: geo_decls.h,v 1.6 1997/07/29 16:16:13 thomas Exp $
9
9
*
10
10
* NOTE
11
11
* These routines do *not* use the float types from adt/.
39
39
#define FPge (A ,B ) ((B) - (A) <= EPSILON)
40
40
#else
41
41
#define FPzero (A ) (A == 0)
42
+ #define FPnzero (A ) (A != 0)
42
43
#define FPeq (A ,B ) (A == B)
44
+ #define FPne (A ,B ) (A != B)
43
45
#define FPlt (A ,B ) (A < B)
44
46
#define FPle (A ,B ) (A <= B)
45
47
#define FPgt (A ,B ) (A > B)
@@ -98,6 +100,7 @@ typedef struct {
98
100
*-------------------------------------------------------------------*/
99
101
typedef struct {
100
102
double A , B , C ;
103
+
101
104
double m ;
102
105
} LINE ;
103
106
@@ -133,11 +136,78 @@ typedef struct {
133
136
/*
134
137
* in geo_ops.h
135
138
*/
139
+
140
+ /* public point routines */
141
+ extern Point * point_in (char * str );
142
+ extern char * point_out (Point * pt );
143
+ extern Point * point_construct (double x , double y );
144
+ extern Point * point_copy (Point * pt );
145
+ extern bool point_left (Point * pt1 , Point * pt2 );
146
+ extern bool point_right (Point * pt1 , Point * pt2 );
147
+ extern bool point_above (Point * pt1 , Point * pt2 );
148
+ extern bool point_below (Point * pt1 , Point * pt2 );
149
+ extern bool point_vert (Point * pt1 , Point * pt2 );
150
+ extern bool point_horiz (Point * pt1 , Point * pt2 );
151
+ extern bool point_eq (Point * pt1 , Point * pt2 );
152
+ extern int32 pointdist (Point * p1 , Point * p2 );
153
+ extern double * point_distance (Point * pt1 , Point * pt2 );
154
+ extern double * point_slope (Point * pt1 , Point * pt2 );
155
+
156
+ /* private routines */
157
+ extern double point_dt (Point * pt1 , Point * pt2 );
158
+ extern double point_sl (Point * pt1 , Point * pt2 );
159
+
160
+ extern Point * point (float8 * x , float8 * y );
161
+ extern Point * point_add (Point * p1 , Point * p2 );
162
+ extern Point * point_sub (Point * p1 , Point * p2 );
163
+ extern Point * point_mul (Point * p1 , Point * p2 );
164
+ extern Point * point_div (Point * p1 , Point * p2 );
165
+
166
+ /* public lseg routines */
167
+ extern LSEG * lseg_in (char * str );
168
+ extern char * lseg_out (LSEG * ls );
169
+ extern bool lseg_intersect (LSEG * l1 , LSEG * l2 );
170
+ extern bool lseg_parallel (LSEG * l1 , LSEG * l2 );
171
+ extern bool lseg_perp (LSEG * l1 , LSEG * l2 );
172
+ extern bool lseg_vertical (LSEG * lseg );
173
+ extern bool lseg_horizontal (LSEG * lseg );
174
+ extern bool lseg_eq (LSEG * l1 , LSEG * l2 );
175
+ extern double * lseg_distance (LSEG * l1 , LSEG * l2 );
176
+ extern Point * lseg_center (LSEG * lseg );
177
+ extern Point * lseg_interpt (LSEG * l1 , LSEG * l2 );
178
+ extern double * dist_pl (Point * pt , LINE * line );
179
+ extern double * dist_ps (Point * pt , LSEG * lseg );
180
+ extern double * dist_ppath (Point * pt , PATH * path );
181
+ extern double * dist_pb (Point * pt , BOX * box );
182
+ extern double * dist_sl (LSEG * lseg , LINE * line );
183
+ extern double * dist_sb (LSEG * lseg , BOX * box );
184
+ extern double * dist_lb (LINE * line , BOX * box );
185
+ extern Point * interpt_sl (LSEG * lseg , LINE * line );
186
+ extern Point * close_pl (Point * pt , LINE * line );
187
+ extern Point * close_ps (Point * pt , LSEG * lseg );
188
+ extern Point * close_pb (Point * pt , BOX * box );
189
+ extern Point * close_sl (LSEG * lseg , LINE * line );
190
+ extern Point * close_sb (LSEG * lseg , BOX * box );
191
+ extern Point * close_lb (LINE * line , BOX * box );
192
+ extern bool on_pl (Point * pt , LINE * line );
193
+ extern bool on_ps (Point * pt , LSEG * lseg );
194
+ extern bool on_pb (Point * pt , BOX * box );
195
+ extern bool on_ppath (Point * pt , PATH * path );
196
+ extern bool on_sl (LSEG * lseg , LINE * line );
197
+ extern bool on_sb (LSEG * lseg , BOX * box );
198
+ extern bool inter_sl (LSEG * lseg , LINE * line );
199
+ extern bool inter_sb (LSEG * lseg , BOX * box );
200
+ extern bool inter_lb (LINE * line , BOX * box );
201
+
202
+ /* private routines */
203
+ extern LSEG * lseg_construct (Point * pt1 , Point * pt2 );
204
+ extern void statlseg_construct (LSEG * lseg , Point * pt1 , Point * pt2 );
205
+ extern double lseg_dt (LSEG * l1 , LSEG * l2 );
206
+ extern void make_bound_box (POLYGON * poly );
207
+
208
+ /* public box routines */
136
209
extern BOX * box_in (char * str );
137
210
extern char * box_out (BOX * box );
138
- extern BOX * box_construct (double x1 , double x2 , double y1 , double y2 );
139
- extern BOX * box_fill (BOX * result , double x1 , double x2 , double y1 , double y2 );
140
- extern BOX * box_copy (BOX * box );
141
211
extern bool box_same (BOX * box1 , BOX * box2 );
142
212
extern bool box_overlap (BOX * box1 , BOX * box2 );
143
213
extern bool box_overleft (BOX * box1 , BOX * box2 );
@@ -155,16 +225,20 @@ extern bool box_le(BOX *box1, BOX *box2);
155
225
extern bool box_ge (BOX * box1 , BOX * box2 );
156
226
extern Point * box_center (BOX * box );
157
227
extern double * box_area (BOX * box );
158
- extern double * box_length (BOX * box );
228
+ extern double * box_width (BOX * box );
159
229
extern double * box_height (BOX * box );
160
230
extern double * box_distance (BOX * box1 , BOX * box2 );
161
231
extern Point * box_center (BOX * box );
162
232
extern BOX * box_intersect (BOX * box1 , BOX * box2 );
163
233
extern LSEG * box_diagonal (BOX * box );
164
234
165
235
/* private routines */
236
+ extern BOX * box_construct (double x1 , double x2 , double y1 , double y2 );
237
+ extern BOX * box_fill (BOX * result , double x1 , double x2 , double y1 , double y2 );
238
+ extern BOX * box_copy (BOX * box );
239
+
166
240
extern double box_ar (BOX * box );
167
- extern double box_ln (BOX * box );
241
+ extern double box_wd (BOX * box );
168
242
extern double box_ht (BOX * box );
169
243
extern double box_dt (BOX * box1 , BOX * box2 );
170
244
@@ -174,6 +248,7 @@ extern BOX *box_sub(BOX *box, Point *p);
174
248
extern BOX * box_mul (BOX * box , Point * p );
175
249
extern BOX * box_div (BOX * box , Point * p );
176
250
251
+ /* private line routines */
177
252
extern LINE * line_construct_pm (Point * pt , double m );
178
253
extern LINE * line_construct_pp (Point * pt1 , Point * pt2 );
179
254
extern bool line_intersect (LINE * l1 , LINE * l2 );
@@ -185,6 +260,7 @@ extern bool line_eq(LINE *l1, LINE *l2);
185
260
extern double * line_distance (LINE * l1 , LINE * l2 );
186
261
extern Point * line_interpt (LINE * l1 , LINE * l2 );
187
262
263
+ /* public path routines */
188
264
extern PATH * path_in (char * str );
189
265
extern char * path_out (PATH * path );
190
266
extern bool path_n_lt (PATH * p1 , PATH * p2 );
@@ -207,80 +283,18 @@ extern PATH *path_add_pt(PATH *path, Point *point);
207
283
extern PATH * path_sub_pt (PATH * path , Point * point );
208
284
extern PATH * path_mul_pt (PATH * path , Point * point );
209
285
extern PATH * path_div_pt (PATH * path , Point * point );
286
+ extern bool path_contain_pt ( PATH * path , Point * p );
287
+ extern bool pt_contained_path ( Point * p , PATH * path );
210
288
289
+ extern Point * path_center (PATH * path );
211
290
extern POLYGON * path_poly (PATH * path );
291
+
212
292
extern PATH * upgradepath (PATH * path );
213
293
extern bool isoldpath (PATH * path );
214
294
215
295
/* private routines */
216
296
extern double path_ln (PATH * path );
217
-
218
- /* public point routines */
219
- extern Point * point_in (char * str );
220
- extern char * point_out (Point * pt );
221
- extern Point * point_construct (double x , double y );
222
- extern Point * point_copy (Point * pt );
223
- extern bool point_left (Point * pt1 , Point * pt2 );
224
- extern bool point_right (Point * pt1 , Point * pt2 );
225
- extern bool point_above (Point * pt1 , Point * pt2 );
226
- extern bool point_below (Point * pt1 , Point * pt2 );
227
- extern bool point_vert (Point * pt1 , Point * pt2 );
228
- extern bool point_horiz (Point * pt1 , Point * pt2 );
229
- extern bool point_eq (Point * pt1 , Point * pt2 );
230
- extern int32 pointdist (Point * p1 , Point * p2 );
231
- extern double * point_distance (Point * pt1 , Point * pt2 );
232
- extern double * point_slope (Point * pt1 , Point * pt2 );
233
-
234
- /* private routines */
235
- extern double point_dt (Point * pt1 , Point * pt2 );
236
- extern double point_sl (Point * pt1 , Point * pt2 );
237
-
238
- extern Point * point (float8 * x , float8 * y );
239
- extern Point * point_add (Point * p1 , Point * p2 );
240
- extern Point * point_sub (Point * p1 , Point * p2 );
241
- extern Point * point_mul (Point * p1 , Point * p2 );
242
- extern Point * point_div (Point * p1 , Point * p2 );
243
-
244
- /* public lseg routines */
245
- extern LSEG * lseg_in (char * str );
246
- extern char * lseg_out (LSEG * ls );
247
- extern bool lseg_intersect (LSEG * l1 , LSEG * l2 );
248
- extern bool lseg_parallel (LSEG * l1 , LSEG * l2 );
249
- extern bool lseg_perp (LSEG * l1 , LSEG * l2 );
250
- extern bool lseg_vertical (LSEG * lseg );
251
- extern bool lseg_horizontal (LSEG * lseg );
252
- extern bool lseg_eq (LSEG * l1 , LSEG * l2 );
253
- extern double * lseg_distance (LSEG * l1 , LSEG * l2 );
254
- extern Point * lseg_interpt (LSEG * l1 , LSEG * l2 );
255
- extern double * dist_pl (Point * pt , LINE * line );
256
- extern double * dist_ps (Point * pt , LSEG * lseg );
257
- extern double * dist_ppth (Point * pt , PATH * path );
258
- extern double * dist_pb (Point * pt , BOX * box );
259
- extern double * dist_sl (LSEG * lseg , LINE * line );
260
- extern double * dist_sb (LSEG * lseg , BOX * box );
261
- extern double * dist_lb (LINE * line , BOX * box );
262
- extern Point * interpt_sl (LSEG * lseg , LINE * line );
263
- extern Point * close_pl (Point * pt , LINE * line );
264
- extern Point * close_ps (Point * pt , LSEG * lseg );
265
- extern Point * close_pb (Point * pt , BOX * box );
266
- extern Point * close_sl (LSEG * lseg , LINE * line );
267
- extern Point * close_sb (LSEG * lseg , BOX * box );
268
- extern Point * close_lb (LINE * line , BOX * box );
269
- extern bool on_pl (Point * pt , LINE * line );
270
- extern bool on_ps (Point * pt , LSEG * lseg );
271
- extern bool on_pb (Point * pt , BOX * box );
272
- extern bool on_ppath (Point * pt , PATH * path );
273
- extern bool on_sl (LSEG * lseg , LINE * line );
274
- extern bool on_sb (LSEG * lseg , BOX * box );
275
- extern bool inter_sl (LSEG * lseg , LINE * line );
276
- extern bool inter_sb (LSEG * lseg , BOX * box );
277
- extern bool inter_lb (LINE * line , BOX * box );
278
-
279
- /* private routines */
280
- extern LSEG * lseg_construct (Point * pt1 , Point * pt2 );
281
- extern void statlseg_construct (LSEG * lseg , Point * pt1 , Point * pt2 );
282
- extern double lseg_dt (LSEG * l1 , LSEG * l2 );
283
- extern void make_bound_box (POLYGON * poly );
297
+ extern bool plist_same (int npts , Point p1 [], Point p2 []);
284
298
285
299
/* public polygon routines */
286
300
extern POLYGON * poly_in (char * s );
@@ -293,14 +307,21 @@ extern bool poly_same(POLYGON *polya, POLYGON *polyb);
293
307
extern bool poly_overlap (POLYGON * polya , POLYGON * polyb );
294
308
extern bool poly_contain (POLYGON * polya , POLYGON * polyb );
295
309
extern bool poly_contained (POLYGON * polya , POLYGON * polyb );
310
+ extern bool poly_contain_pt ( POLYGON * poly , Point * p );
311
+ extern bool pt_contained_poly ( Point * p , POLYGON * poly );
296
312
313
+ extern double * poly_distance (POLYGON * polya , POLYGON * polyb );
297
314
extern int4 poly_npoints (POLYGON * poly );
315
+ extern Point * poly_center (POLYGON * poly );
298
316
extern BOX * poly_box (POLYGON * poly );
299
317
extern PATH * poly_path (POLYGON * poly );
300
318
extern POLYGON * box_poly (BOX * box );
319
+
301
320
extern POLYGON * upgradepoly (POLYGON * poly );
302
321
extern POLYGON * revertpoly (POLYGON * poly );
303
322
323
+ /* private polygon routines */
324
+
304
325
/* public circle routines */
305
326
extern CIRCLE * circle_in (char * str );
306
327
extern char * circle_out (CIRCLE * circle );
@@ -321,6 +342,8 @@ extern bool circle_lt(CIRCLE *circle1, CIRCLE *circle2);
321
342
extern bool circle_gt (CIRCLE * circle1 , CIRCLE * circle2 );
322
343
extern bool circle_le (CIRCLE * circle1 , CIRCLE * circle2 );
323
344
extern bool circle_ge (CIRCLE * circle1 , CIRCLE * circle2 );
345
+ extern bool circle_contain_pt (CIRCLE * circle , Point * point );
346
+ extern bool pt_contained_circle (Point * point , CIRCLE * circle );
324
347
extern CIRCLE * circle_add_pt (CIRCLE * circle , Point * point );
325
348
extern CIRCLE * circle_sub_pt (CIRCLE * circle , Point * point );
326
349
extern CIRCLE * circle_mul_pt (CIRCLE * circle , Point * point );
@@ -330,8 +353,11 @@ extern double *circle_diameter(CIRCLE *circle);
330
353
extern double * circle_radius (CIRCLE * circle );
331
354
extern double * circle_distance (CIRCLE * circle1 , CIRCLE * circle2 );
332
355
extern double * dist_pc (Point * point , CIRCLE * circle );
356
+ extern double * dist_cpoly (CIRCLE * circle , POLYGON * poly );
333
357
extern Point * circle_center (CIRCLE * circle );
334
358
extern CIRCLE * circle (Point * center , float8 * radius );
359
+ extern CIRCLE * box_circle (BOX * box );
360
+ extern BOX * circle_box (CIRCLE * circle );
335
361
extern CIRCLE * poly_circle (POLYGON * poly );
336
362
extern POLYGON * circle_poly (int npts , CIRCLE * circle );
337
363
0 commit comments