@ -1,17 +1,18 @@
/*-------------------------------------------------------------------------
*
* geo_decls . h - -
* Declarations for various 2 D constructs .
* geo_decls . h - Declarations for various 2 D constructs .
*
*
* Copyright ( c ) 1994 , Regents of the University of California
*
* $ Id : geo_decls . h , v 1.1 1997 / 03 / 14 23 : 33 : 27 scrappy Exp $
* $ Id : geo_decls . h , v 1.2 1997 / 04 / 22 17 : 32 : 41 scrappy Exp $
*
* NOTE
* These routines do * not * use the float types from adt / .
*
* XXX These routines were not written by a numerical analyst .
* XXX I have made some attempt to flesh out the operators
* and data types . There are still some more to do . - tgl 97 / 04 / 19
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
@ -23,23 +24,32 @@
/*#ifndef FmgrIncluded -- seems like always included. (it's FMgrIncluded) AY */
/*--------------------------------------------------------------------
* Useful floating point utilities and constants .
* Useful floating point utilities and constants .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
# define EPSILON 1.0E-06
# ifdef EPSILON
# define FPzero(A) (fabs(A) <= EPSILON)
# define FPeq(A,B) (fabs((A) - (B)) <= EPSILON)
# define FPlt(A,B) ((B) - (A) > EPSILON)
# define FPle(A,B) ((A) - (B) <= EPSILON)
# define FPgt(A,B) ((A) - (B) > EPSILON)
# define FPge(A,B) ((B) - (A) <= EPSILON)
# else
# define FPzero(A) (A == 0)
# define FPeq(A,B) (A == B)
# define FPlt(A,B) (A < B)
# define FPle(A,B) (A <= B)
# define FPgt(A,B) (A > B)
# define FPge(A,B) (A >= B)
# endif
# define HYPOT(A, B) sqrt((A) * (A) + (B) * (B))
/*--------------------------------------------------------------------
* Memory management .
* Memory management .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
# define PALLOC(SIZE) palloc(SIZE)
@ -49,7 +59,7 @@
/*#endif !FmgrIncluded */
/*---------------------------------------------------------------------
* Point - ( x , y )
* Point - ( x , y )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct {
double x , y ;
@ -57,7 +67,7 @@ typedef struct {
/*---------------------------------------------------------------------
* LSEG - A straight line , specified by endpoints .
* LSEG - A straight line , specified by endpoints .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct {
Point p [ 2 ] ;
@ -67,24 +77,24 @@ typedef struct {
/*---------------------------------------------------------------------
* PATH - Specified by vertex points .
* PATH - Specified by vertex points .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct {
int32 length ; /* XXX varlena */
int32 size ; /* XXX varlena */
int32 npts ;
int32 closed ; /* is this a closed polygon? */
int32 dummy ; /* padding to make it double align */
Point p [ 1 ] ; /* variable length array of POINTs */
Point p [ 0 ] ; /* variable length array of POINTs */
} PATH ;
/*---------------------------------------------------------------------
* LINE - Specified by its general equation ( Ax + By + C = 0 ) .
* If there is a y - intercept , it is C , which
* incidentally gives a freebie point on the line
* ( if B = 0 , then C is the x - intercept ) .
* Slope m is precalculated to save time ; if
* the line is not vertical , m = = A .
* LINE - Specified by its general equation ( Ax + By + C = 0 ) .
* If there is a y - intercept , it is C , which
* incidentally gives a freebie point on the line
* ( if B = 0 , then C is the x - intercept ) .
* Slope m is precalculated to save time ; if
* the line is not vertical , m = = A .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct {
double A , B , C ;
@ -93,25 +103,32 @@ typedef struct {
/*---------------------------------------------------------------------
* BOX - Specified by two corner points , which are
* sorted to save calculation time later .
* BOX - Specified by two corner points , which are
* sorted to save calculation time later .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct {
double xh , yh , xl , yl ; /* high and low coord s */
Point high , low ; /* corner POINT s */
} BOX ;
/*---------------------------------------------------------------------
* POLYGON - Specified by an array of doubles defining the points ,
* keeping the number of points and the bounding box for
* speed purposes .
* POLYGON - Specified by an array of doubles defining the points ,
* keeping the number of points and the bounding box for
* speed purposes .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct {
int32 size ; /* XXX varlena */
int32 npts ;
BOX boundbox ;
char pts [ 1 ] ;
Point p [ 0 ] ; /* variable length array of POINTs */
} POLYGON ;
/*---------------------------------------------------------------------
* CIRCLE - Specified by a center point and radius .
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct {
Point center ;
double radius ;
} CIRCLE ;
/*
* in geo_ops . h
@ -121,81 +138,115 @@ extern char *box_out(BOX *box);
extern BOX * box_construct ( double x1 , double x2 , double y1 , double y2 ) ;
extern BOX * box_fill ( BOX * result , double x1 , double x2 , double y1 , double y2 ) ;
extern BOX * box_copy ( BOX * box ) ;
extern long box_same ( BOX * box1 , BOX * box2 ) ;
extern long box_overlap ( BOX * box1 , BOX * box2 ) ;
extern long box_overleft ( BOX * box1 , BOX * box2 ) ;
extern long box_left ( BOX * box1 , BOX * box2 ) ;
extern long box_right ( BOX * box1 , BOX * box2 ) ;
extern long box_overright ( BOX * box1 , BOX * box2 ) ;
extern long box_contained ( BOX * box1 , BOX * box2 ) ;
extern long box_contain ( BOX * box1 , BOX * box2 ) ;
extern long box_below ( BOX * box1 , BOX * box2 ) ;
extern long box_above ( BOX * box1 , BOX * box2 ) ;
extern long box_lt ( BOX * box1 , BOX * box2 ) ;
extern long box_gt ( BOX * box1 , BOX * box2 ) ;
extern long box_eq ( BOX * box1 , BOX * box2 ) ;
extern long box_le ( BOX * box1 , BOX * box2 ) ;
extern long box_ge ( BOX * box1 , BOX * box2 ) ;
extern bool box_same ( BOX * box1 , BOX * box2 ) ;
extern bool box_overlap ( BOX * box1 , BOX * box2 ) ;
extern bool box_overleft ( BOX * box1 , BOX * box2 ) ;
extern bool box_left ( BOX * box1 , BOX * box2 ) ;
extern bool box_right ( BOX * box1 , BOX * box2 ) ;
extern bool box_overright ( BOX * box1 , BOX * box2 ) ;
extern bool box_contained ( BOX * box1 , BOX * box2 ) ;
extern bool box_contain ( BOX * box1 , BOX * box2 ) ;
extern bool box_below ( BOX * box1 , BOX * box2 ) ;
extern bool box_above ( BOX * box1 , BOX * box2 ) ;
extern bool box_lt ( BOX * box1 , BOX * box2 ) ;
extern bool box_gt ( BOX * box1 , BOX * box2 ) ;
extern bool box_eq ( BOX * box1 , BOX * box2 ) ;
extern bool box_le ( BOX * box1 , BOX * box2 ) ;
extern bool box_ge ( BOX * box1 , BOX * box2 ) ;
extern Point * box_center ( BOX * box ) ;
extern double * box_area ( BOX * box ) ;
extern double * box_length ( BOX * box ) ;
extern double * box_height ( BOX * box ) ;
extern double * box_distance ( BOX * box1 , BOX * box2 ) ;
extern Point * box_center ( BOX * box ) ;
extern BOX * box_intersect ( BOX * box1 , BOX * box2 ) ;
extern LSEG * box_diagonal ( BOX * box ) ;
/* private routines */
extern double box_ar ( BOX * box ) ;
extern double box_ln ( BOX * box ) ;
extern double box_ht ( BOX * box ) ;
extern double box_dt ( BOX * box1 , BOX * box2 ) ;
extern BOX * box_intersect ( BOX * box1 , BOX * box2 ) ;
extern LSEG * box_diagonal ( BOX * box ) ;
extern BOX * box ( Point * p1 , Point * p2 ) ;
extern BOX * box_add ( BOX * box , Point * p ) ;
extern BOX * box_sub ( BOX * box , Point * p ) ;
extern BOX * box_mul ( BOX * box , Point * p ) ;
extern BOX * box_div ( BOX * box , Point * p ) ;
extern LINE * line_construct_pm ( Point * pt , double m ) ;
extern LINE * line_construct_pp ( Point * pt1 , Point * pt2 ) ;
extern long line_intersect ( LINE * l1 , LINE * l2 ) ;
extern long line_parallel ( LINE * l1 , LINE * l2 ) ;
extern long line_perp ( LINE * l1 , LINE * l2 ) ;
extern long line_vertical ( LINE * line ) ;
extern long line_horizontal ( LINE * line ) ;
extern long line_eq ( LINE * l1 , LINE * l2 ) ;
extern bool line_intersect ( LINE * l1 , LINE * l2 ) ;
extern bool line_parallel ( LINE * l1 , LINE * l2 ) ;
extern bool line_perp ( LINE * l1 , LINE * l2 ) ;
extern bool line_vertical ( LINE * line ) ;
extern bool line_horizontal ( LINE * line ) ;
extern bool line_eq ( LINE * l1 , LINE * l2 ) ;
extern double * line_distance ( LINE * l1 , LINE * l2 ) ;
extern Point * line_interpt ( LINE * l1 , LINE * l2 ) ;
extern PATH * path_in ( char * str ) ;
extern char * path_out ( PATH * path ) ;
extern long path_n_lt ( PATH * p1 , PATH * p2 ) ;
extern long path_n_gt ( PATH * p1 , PATH * p2 ) ;
extern long path_n_eq ( PATH * p1 , PATH * p2 ) ;
extern long path_n_le ( PATH * p1 , PATH * p2 ) ;
extern long path_n_ge ( PATH * p1 , PATH * p2 ) ;
extern long path_inter ( PATH * p1 , PATH * p2 ) ;
extern bool path_n_lt ( PATH * p1 , PATH * p2 ) ;
extern bool path_n_gt ( PATH * p1 , PATH * p2 ) ;
extern bool path_n_eq ( PATH * p1 , PATH * p2 ) ;
extern bool path_n_le ( PATH * p1 , PATH * p2 ) ;
extern bool path_n_ge ( PATH * p1 , PATH * p2 ) ;
extern bool path_inter ( PATH * p1 , PATH * p2 ) ;
extern double * path_distance ( PATH * p1 , PATH * p2 ) ;
extern double * path_length ( PATH * path ) ;
/* private routines */
extern double path_ln ( PATH * path ) ;
extern bool path_isclosed ( PATH * path ) ;
extern bool path_isopen ( PATH * path ) ;
extern int4 path_npoints ( PATH * path ) ;
extern PATH * path_close ( PATH * path ) ;
extern PATH * path_open ( PATH * path ) ;
extern PATH * path_add ( PATH * p1 , PATH * p2 ) ;
extern PATH * path_add_pt ( PATH * path , Point * point ) ;
extern PATH * path_sub_pt ( PATH * path , Point * point ) ;
extern PATH * path_mul_pt ( PATH * path , Point * point ) ;
extern PATH * path_div_pt ( PATH * path , Point * point ) ;
extern POLYGON * path_poly ( PATH * path ) ;
extern Point * point_in ( char * str ) ;
extern char * point_out ( Point * pt ) ;
extern Point * point_construct ( double x , double y ) ;
extern Point * point_copy ( Point * pt ) ;
extern long point_left ( Point * pt1 , Point * pt2 ) ;
extern long point_right ( Point * pt1 , Point * pt2 ) ;
extern long point_above ( Point * pt1 , Point * pt2 ) ;
extern long point_below ( Point * pt1 , Point * pt2 ) ;
extern long point_vert ( Point * pt1 , Point * pt2 ) ;
extern long point_horiz ( Point * pt1 , Point * pt2 ) ;
extern long point_eq ( Point * pt1 , Point * pt2 ) ;
extern long pointdist ( Point * p1 , Point * p2 ) ;
extern bool point_left ( Point * pt1 , Point * pt2 ) ;
extern bool point_right ( Point * pt1 , Point * pt2 ) ;
extern bool point_above ( Point * pt1 , Point * pt2 ) ;
extern bool point_below ( Point * pt1 , Point * pt2 ) ;
extern bool point_vert ( Point * pt1 , Point * pt2 ) ;
extern bool point_horiz ( Point * pt1 , Point * pt2 ) ;
extern bool point_eq ( Point * pt1 , Point * pt2 ) ;
extern int32 pointdist ( Point * p1 , Point * p2 ) ;
extern double * point_distance ( Point * pt1 , Point * pt2 ) ;
extern double point_dt ( Point * pt1 , Point * pt2 ) ;
extern double * point_slope ( Point * pt1 , Point * pt2 ) ;
/* private routines */
extern double point_dt ( Point * pt1 , Point * pt2 ) ;
extern double point_sl ( Point * pt1 , Point * pt2 ) ;
extern Point * point ( float8 * x , float8 * y ) ;
extern Point * point_add ( Point * p1 , Point * p2 ) ;
extern Point * point_sub ( Point * p1 , Point * p2 ) ;
extern Point * point_mul ( Point * p1 , Point * p2 ) ;
extern Point * point_div ( Point * p1 , Point * p2 ) ;
extern LSEG * lseg_in ( char * str ) ;
extern char * lseg_out ( LSEG * ls ) ;
extern LSEG * lseg_construct ( Point * pt1 , Point * pt2 ) ;
extern void statlseg_construct ( LSEG * lseg , Point * pt1 , Point * pt2 ) ;
extern long lseg_intersect ( LSEG * l1 , LSEG * l2 ) ;
extern long lseg_parallel ( LSEG * l1 , LSEG * l2 ) ;
extern long lseg_perp ( LSEG * l1 , LSEG * l2 ) ;
extern long lseg_vertical ( LSEG * lseg ) ;
extern long lseg_horizontal ( LSEG * lseg ) ;
extern long lseg_eq ( LSEG * l1 , LSEG * l2 ) ;
extern bool lseg_intersect ( LSEG * l1 , LSEG * l2 ) ;
extern bool lseg_parallel ( LSEG * l1 , LSEG * l2 ) ;
extern bool lseg_perp ( LSEG * l1 , LSEG * l2 ) ;
extern bool lseg_vertical ( LSEG * lseg ) ;
extern bool lseg_horizontal ( LSEG * lseg ) ;
extern bool lseg_eq ( LSEG * l1 , LSEG * l2 ) ;
extern double * lseg_distance ( LSEG * l1 , LSEG * l2 ) ;
extern double lseg_dt ( LSEG * l1 , LSEG * l2 ) ;
extern Point * lseg_interpt ( LSEG * l1 , LSEG * l2 ) ;
extern double * dist_pl ( Point * pt , LINE * line ) ;
extern double * dist_ps ( Point * pt , LSEG * lseg ) ;
@ -211,29 +262,73 @@ extern Point *close_pb(Point *pt, BOX *box);
extern Point * close_sl ( LSEG * lseg , LINE * line ) ;
extern Point * close_sb ( LSEG * lseg , BOX * box ) ;
extern Point * close_lb ( LINE * line , BOX * box ) ;
extern long on_pl ( Point * pt , LINE * line ) ;
extern long on_ps ( Point * pt , LSEG * lseg ) ;
extern long on_pb ( Point * pt , BOX * box ) ;
extern long on_ppath ( Point * pt , PATH * path ) ;
extern long on_sl ( LSEG * lseg , LINE * line ) ;
extern long on_sb ( LSEG * lseg , BOX * box ) ;
extern long inter_sl ( LSEG * lseg , LINE * line ) ;
extern long inter_sb ( LSEG * lseg , BOX * box ) ;
extern long inter_lb ( LINE * line , BOX * box ) ;
extern bool on_pl ( Point * pt , LINE * line ) ;
extern bool on_ps ( Point * pt , LSEG * lseg ) ;
extern bool on_pb ( Point * pt , BOX * box ) ;
extern bool on_ppath ( Point * pt , PATH * path ) ;
extern bool on_sl ( LSEG * lseg , LINE * line ) ;
extern bool on_sb ( LSEG * lseg , BOX * box ) ;
extern bool inter_sl ( LSEG * lseg , LINE * line ) ;
extern bool inter_sb ( LSEG * lseg , BOX * box ) ;
extern bool inter_lb ( LINE * line , BOX * box ) ;
/* private routines */
extern LSEG * lseg_construct ( Point * pt1 , Point * pt2 ) ;
extern void statlseg_construct ( LSEG * lseg , Point * pt1 , Point * pt2 ) ;
extern double lseg_dt ( LSEG * l1 , LSEG * l2 ) ;
extern void make_bound_box ( POLYGON * poly ) ;
extern POLYGON * poly_in ( char * s ) ;
extern long poly_pt_count ( char * s , char delim ) ;
extern char * poly_out ( POLYGON * poly ) ;
extern double poly_max ( double * coords , int ncoords ) ;
extern double poly_min ( double * coords , int ncoords ) ;
extern long poly_left ( POLYGON * polya , POLYGON * polyb ) ;
extern long poly_overleft ( POLYGON * polya , POLYGON * polyb ) ;
extern long poly_right ( POLYGON * polya , POLYGON * polyb ) ;
extern long poly_overright ( POLYGON * polya , POLYGON * polyb ) ;
extern long poly_same ( POLYGON * polya , POLYGON * polyb ) ;
extern long poly_overlap ( POLYGON * polya , POLYGON * polyb ) ;
extern long poly_contain ( POLYGON * polya , POLYGON * polyb ) ;
extern long poly_contained ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_left ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_overleft ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_right ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_overright ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_same ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_overlap ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_contain ( POLYGON * polya , POLYGON * polyb ) ;
extern bool poly_contained ( POLYGON * polya , POLYGON * polyb ) ;
extern int4 poly_npoints ( POLYGON * poly ) ;
extern BOX * poly_box ( POLYGON * poly ) ;
extern PATH * poly_path ( POLYGON * poly ) ;
extern POLYGON * box_poly ( BOX * box ) ;
extern CIRCLE * circle_in ( char * str ) ;
extern char * circle_out ( CIRCLE * circle ) ;
extern bool circle_same ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_overlap ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_overleft ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_left ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_right ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_overright ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_contained ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_contain ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_below ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_above ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_eq ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_ne ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_lt ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_gt ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_le ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern bool circle_ge ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern CIRCLE * circle_add_pt ( CIRCLE * circle , Point * point ) ;
extern CIRCLE * circle_sub_pt ( CIRCLE * circle , Point * point ) ;
extern CIRCLE * circle_mul_pt ( CIRCLE * circle , Point * point ) ;
extern CIRCLE * circle_div_pt ( CIRCLE * circle , Point * point ) ;
extern double * circle_area ( CIRCLE * circle ) ;
extern double * circle_diameter ( CIRCLE * circle ) ;
extern double * circle_radius ( CIRCLE * circle ) ;
extern double * circle_distance ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
extern Point * circle_center ( CIRCLE * circle ) ;
extern CIRCLE * circle ( Point * center , float8 * radius ) ;
extern CIRCLE * poly_circle ( POLYGON * poly ) ;
extern POLYGON * circle_poly ( int npts , CIRCLE * circle ) ;
/* private routines */
extern double circle_ar ( CIRCLE * circle ) ;
extern double circle_dt ( CIRCLE * circle1 , CIRCLE * circle2 ) ;
/* geo_selfuncs.c */
extern float64 areasel ( Oid opid , Oid relid , AttrNumber attno ,
@ -247,6 +342,6 @@ extern float64 leftjoinsel(Oid opid, Oid relid, AttrNumber attno,
extern float64 contsel ( Oid opid , Oid relid , AttrNumber attno ,
char * value , int32 flag ) ;
extern float64 contjoinsel ( Oid opid , Oid relid , AttrNumber attno ,
char * value , int32 flag ) ;
char * value , int32 flag ) ;
# endif /* GEO_DECLS_H */