geo_decls.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:13k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * geo_decls.h - Declarations for various 2D constructs.
  4.  *
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  * $Id: geo_decls.h,v 1.23 1999/05/25 16:14:54 momjian Exp $
  9.  *
  10.  * NOTE
  11.  *   These routines do *not* use the float types from adt/.
  12.  *
  13.  *   XXX These routines were not written by a numerical analyst.
  14.  *   XXX I have made some attempt to flesh out the operators
  15.  * and data types. There are still some more to do. - tgl 97/04/19
  16.  *
  17.  *-------------------------------------------------------------------------
  18.  */
  19. #ifndef GEO_DECLS_H
  20. #define GEO_DECLS_H
  21. #include "access/attnum.h"
  22. /*--------------------------------------------------------------------
  23.  * Useful floating point utilities and constants.
  24.  *-------------------------------------------------------------------*/
  25. #define EPSILON 1.0E-06
  26. #ifdef EPSILON
  27. #define FPzero(A) (fabs(A) <= EPSILON)
  28. #define FPeq(A,B) (fabs((A) - (B)) <= EPSILON)
  29. #define FPlt(A,B) ((B) - (A) > EPSILON)
  30. #define FPle(A,B) ((A) - (B) <= EPSILON)
  31. #define FPgt(A,B) ((A) - (B) > EPSILON)
  32. #define FPge(A,B) ((B) - (A) <= EPSILON)
  33. #else
  34. #define FPzero(A) (A == 0)
  35. #define FPnzero(A) (A != 0)
  36. #define FPeq(A,B) (A == B)
  37. #define FPne(A,B) (A != B)
  38. #define FPlt(A,B) (A < B)
  39. #define FPle(A,B) (A <= B)
  40. #define FPgt(A,B) (A > B)
  41. #define FPge(A,B) (A >= B)
  42. #endif
  43. #define HYPOT(A, B) sqrt((A) * (A) + (B) * (B))
  44. /*---------------------------------------------------------------------
  45.  * Point - (x,y)
  46.  *-------------------------------------------------------------------*/
  47. typedef struct
  48. {
  49. double x,
  50. y;
  51. } Point;
  52. /*---------------------------------------------------------------------
  53.  * LSEG - A straight line, specified by endpoints.
  54.  *-------------------------------------------------------------------*/
  55. typedef struct
  56. {
  57. Point p[2];
  58. double m; /* precomputed to save time, not in tuple */
  59. } LSEG;
  60. /*---------------------------------------------------------------------
  61.  * PATH - Specified by vertex points.
  62.  *-------------------------------------------------------------------*/
  63. typedef struct
  64. {
  65. int32 size; /* XXX varlena */
  66. int32 npts;
  67. int32 closed; /* is this a closed polygon? */
  68. int32 dummy; /* padding to make it double align */
  69. Point p[1]; /* variable length array of POINTs */
  70. } PATH;
  71. /*---------------------------------------------------------------------
  72.  * LINE - Specified by its general equation (Ax+By+C=0).
  73.  * If there is a y-intercept, it is C, which
  74.  *  incidentally gives a freebie point on the line
  75.  *  (if B=0, then C is the x-intercept).
  76.  * Slope m is precalculated to save time; if
  77.  *  the line is not vertical, m == A.
  78.  *-------------------------------------------------------------------*/
  79. typedef struct
  80. {
  81. double A,
  82. B,
  83. C;
  84. double m;
  85. } LINE;
  86. /*---------------------------------------------------------------------
  87.  * BOX - Specified by two corner points, which are
  88.  *  sorted to save calculation time later.
  89.  *-------------------------------------------------------------------*/
  90. typedef struct
  91. {
  92. Point high,
  93. low; /* corner POINTs */
  94. } BOX;
  95. /*---------------------------------------------------------------------
  96.  * POLYGON - Specified by an array of doubles defining the points,
  97.  * keeping the number of points and the bounding box for
  98.  * speed purposes.
  99.  *-------------------------------------------------------------------*/
  100. typedef struct
  101. {
  102. int32 size; /* XXX varlena */
  103. int32 npts;
  104. BOX boundbox;
  105. Point p[1]; /* variable length array of POINTs */
  106. } POLYGON;
  107. /*---------------------------------------------------------------------
  108.  * CIRCLE - Specified by a center point and radius.
  109.  *-------------------------------------------------------------------*/
  110. typedef struct
  111. {
  112. Point center;
  113. double radius;
  114. } CIRCLE;
  115. /*
  116.  * in geo_ops.h
  117.  */
  118. /* public point routines */
  119. extern Point *point_in(char *str);
  120. extern char *point_out(Point *pt);
  121. extern bool point_left(Point *pt1, Point *pt2);
  122. extern bool point_right(Point *pt1, Point *pt2);
  123. extern bool point_above(Point *pt1, Point *pt2);
  124. extern bool point_below(Point *pt1, Point *pt2);
  125. extern bool point_vert(Point *pt1, Point *pt2);
  126. extern bool point_horiz(Point *pt1, Point *pt2);
  127. extern bool point_eq(Point *pt1, Point *pt2);
  128. extern bool point_ne(Point *pt1, Point *pt2);
  129. extern int32 pointdist(Point *p1, Point *p2);
  130. extern double *point_distance(Point *pt1, Point *pt2);
  131. extern double *point_slope(Point *pt1, Point *pt2);
  132. /* private routines */
  133. extern double point_dt(Point *pt1, Point *pt2);
  134. extern double point_sl(Point *pt1, Point *pt2);
  135. extern Point *point(float8 *x, float8 *y);
  136. extern Point *point_add(Point *p1, Point *p2);
  137. extern Point *point_sub(Point *p1, Point *p2);
  138. extern Point *point_mul(Point *p1, Point *p2);
  139. extern Point *point_div(Point *p1, Point *p2);
  140. /* public lseg routines */
  141. extern LSEG *lseg_in(char *str);
  142. extern char *lseg_out(LSEG *ls);
  143. extern bool lseg_intersect(LSEG *l1, LSEG *l2);
  144. extern bool lseg_parallel(LSEG *l1, LSEG *l2);
  145. extern bool lseg_perp(LSEG *l1, LSEG *l2);
  146. extern bool lseg_vertical(LSEG *lseg);
  147. extern bool lseg_horizontal(LSEG *lseg);
  148. extern bool lseg_eq(LSEG *l1, LSEG *l2);
  149. extern bool lseg_ne(LSEG *l1, LSEG *l2);
  150. extern bool lseg_lt(LSEG *l1, LSEG *l2);
  151. extern bool lseg_le(LSEG *l1, LSEG *l2);
  152. extern bool lseg_gt(LSEG *l1, LSEG *l2);
  153. extern bool lseg_ge(LSEG *l1, LSEG *l2);
  154. extern LSEG *lseg_construct(Point *pt1, Point *pt2);
  155. extern double *lseg_length(LSEG *lseg);
  156. extern double *lseg_distance(LSEG *l1, LSEG *l2);
  157. extern Point *lseg_center(LSEG *lseg);
  158. extern Point *lseg_interpt(LSEG *l1, LSEG *l2);
  159. extern double *dist_pl(Point *pt, LINE *line);
  160. extern double *dist_ps(Point *pt, LSEG *lseg);
  161. extern double *dist_ppath(Point *pt, PATH *path);
  162. extern double *dist_pb(Point *pt, BOX *box);
  163. extern double *dist_sl(LSEG *lseg, LINE *line);
  164. extern double *dist_sb(LSEG *lseg, BOX *box);
  165. extern double *dist_lb(LINE *line, BOX *box);
  166. extern Point *close_lseg(LSEG *l1, LSEG *l2);
  167. extern Point *close_pl(Point *pt, LINE *line);
  168. extern Point *close_ps(Point *pt, LSEG *lseg);
  169. extern Point *close_pb(Point *pt, BOX *box);
  170. extern Point *close_sl(LSEG *lseg, LINE *line);
  171. extern Point *close_sb(LSEG *lseg, BOX *box);
  172. extern Point *close_ls(LINE *line, LSEG *lseg);
  173. extern Point *close_lb(LINE *line, BOX *box);
  174. extern bool on_pl(Point *pt, LINE *line);
  175. extern bool on_ps(Point *pt, LSEG *lseg);
  176. extern bool on_pb(Point *pt, BOX *box);
  177. extern bool on_ppath(Point *pt, PATH *path);
  178. extern bool on_sl(LSEG *lseg, LINE *line);
  179. extern bool on_sb(LSEG *lseg, BOX *box);
  180. extern bool inter_sl(LSEG *lseg, LINE *line);
  181. extern bool inter_sb(LSEG *lseg, BOX *box);
  182. extern bool inter_lb(LINE *line, BOX *box);
  183. /* private lseg routines */
  184. /* public line routines */
  185. extern LINE *line_in(char *str);
  186. extern char *line_out(LINE *line);
  187. extern Point *line_interpt(LINE *l1, LINE *l2);
  188. extern double *line_distance(LINE *l1, LINE *l2);
  189. extern LINE *line_construct_pp(Point *pt1, Point *pt2);
  190. extern bool line_intersect(LINE *l1, LINE *l2);
  191. extern bool line_parallel(LINE *l1, LINE *l2);
  192. extern bool line_perp(LINE *l1, LINE *l2);
  193. extern bool line_vertical(LINE *line);
  194. extern bool line_horizontal(LINE *line);
  195. extern bool line_eq(LINE *l1, LINE *l2);
  196. /* private line routines */
  197. /* public box routines */
  198. extern BOX *box_in(char *str);
  199. extern char *box_out(BOX *box);
  200. extern bool box_same(BOX *box1, BOX *box2);
  201. extern bool box_overlap(BOX *box1, BOX *box2);
  202. extern bool box_overleft(BOX *box1, BOX *box2);
  203. extern bool box_left(BOX *box1, BOX *box2);
  204. extern bool box_right(BOX *box1, BOX *box2);
  205. extern bool box_overright(BOX *box1, BOX *box2);
  206. extern bool box_contained(BOX *box1, BOX *box2);
  207. extern bool box_contain(BOX *box1, BOX *box2);
  208. extern bool box_below(BOX *box1, BOX *box2);
  209. extern bool box_above(BOX *box1, BOX *box2);
  210. extern bool box_lt(BOX *box1, BOX *box2);
  211. extern bool box_gt(BOX *box1, BOX *box2);
  212. extern bool box_eq(BOX *box1, BOX *box2);
  213. extern bool box_le(BOX *box1, BOX *box2);
  214. extern bool box_ge(BOX *box1, BOX *box2);
  215. extern Point *box_center(BOX *box);
  216. extern double *box_area(BOX *box);
  217. extern double *box_width(BOX *box);
  218. extern double *box_height(BOX *box);
  219. extern double *box_distance(BOX *box1, BOX *box2);
  220. extern Point *box_center(BOX *box);
  221. extern BOX *box_intersect(BOX *box1, BOX *box2);
  222. extern LSEG *box_diagonal(BOX *box);
  223. /* private routines */
  224. extern double box_dt(BOX *box1, BOX *box2);
  225. extern BOX *box(Point *p1, Point *p2);
  226. extern BOX *box_add(BOX *box, Point *p);
  227. extern BOX *box_sub(BOX *box, Point *p);
  228. extern BOX *box_mul(BOX *box, Point *p);
  229. extern BOX *box_div(BOX *box, Point *p);
  230. /* public path routines */
  231. extern PATH *path_in(char *str);
  232. extern char *path_out(PATH *path);
  233. extern bool path_n_lt(PATH *p1, PATH *p2);
  234. extern bool path_n_gt(PATH *p1, PATH *p2);
  235. extern bool path_n_eq(PATH *p1, PATH *p2);
  236. extern bool path_n_le(PATH *p1, PATH *p2);
  237. extern bool path_n_ge(PATH *p1, PATH *p2);
  238. extern bool path_inter(PATH *p1, PATH *p2);
  239. extern double *path_distance(PATH *p1, PATH *p2);
  240. extern double *path_length(PATH *path);
  241. extern bool path_isclosed(PATH *path);
  242. extern bool path_isopen(PATH *path);
  243. extern int4 path_npoints(PATH *path);
  244. extern PATH *path_close(PATH *path);
  245. extern PATH *path_open(PATH *path);
  246. extern PATH *path_add(PATH *p1, PATH *p2);
  247. extern PATH *path_add_pt(PATH *path, Point *point);
  248. extern PATH *path_sub_pt(PATH *path, Point *point);
  249. extern PATH *path_mul_pt(PATH *path, Point *point);
  250. extern PATH *path_div_pt(PATH *path, Point *point);
  251. extern bool path_contain_pt(PATH *path, Point *p);
  252. extern bool pt_contained_path(Point *p, PATH *path);
  253. extern Point *path_center(PATH *path);
  254. extern POLYGON *path_poly(PATH *path);
  255. extern PATH *upgradepath(PATH *path);
  256. extern bool isoldpath(PATH *path);
  257. /* public polygon routines */
  258. extern POLYGON *poly_in(char *s);
  259. extern char *poly_out(POLYGON *poly);
  260. extern bool poly_left(POLYGON *polya, POLYGON *polyb);
  261. extern bool poly_overleft(POLYGON *polya, POLYGON *polyb);
  262. extern bool poly_right(POLYGON *polya, POLYGON *polyb);
  263. extern bool poly_overright(POLYGON *polya, POLYGON *polyb);
  264. extern bool poly_same(POLYGON *polya, POLYGON *polyb);
  265. extern bool poly_overlap(POLYGON *polya, POLYGON *polyb);
  266. extern bool poly_contain(POLYGON *polya, POLYGON *polyb);
  267. extern bool poly_contained(POLYGON *polya, POLYGON *polyb);
  268. extern bool poly_contain_pt(POLYGON *poly, Point *p);
  269. extern bool pt_contained_poly(Point *p, POLYGON *poly);
  270. extern double *poly_distance(POLYGON *polya, POLYGON *polyb);
  271. extern int4 poly_npoints(POLYGON *poly);
  272. extern Point *poly_center(POLYGON *poly);
  273. extern BOX *poly_box(POLYGON *poly);
  274. extern PATH *poly_path(POLYGON *poly);
  275. extern POLYGON *box_poly(BOX *box);
  276. extern POLYGON *upgradepoly(POLYGON *poly);
  277. extern POLYGON *revertpoly(POLYGON *poly);
  278. /* private polygon routines */
  279. /* public circle routines */
  280. extern CIRCLE *circle_in(char *str);
  281. extern char *circle_out(CIRCLE *circle);
  282. extern bool circle_same(CIRCLE *circle1, CIRCLE *circle2);
  283. extern bool circle_overlap(CIRCLE *circle1, CIRCLE *circle2);
  284. extern bool circle_overleft(CIRCLE *circle1, CIRCLE *circle2);
  285. extern bool circle_left(CIRCLE *circle1, CIRCLE *circle2);
  286. extern bool circle_right(CIRCLE *circle1, CIRCLE *circle2);
  287. extern bool circle_overright(CIRCLE *circle1, CIRCLE *circle2);
  288. extern bool circle_contained(CIRCLE *circle1, CIRCLE *circle2);
  289. extern bool circle_contain(CIRCLE *circle1, CIRCLE *circle2);
  290. extern bool circle_below(CIRCLE *circle1, CIRCLE *circle2);
  291. extern bool circle_above(CIRCLE *circle1, CIRCLE *circle2);
  292. extern bool circle_eq(CIRCLE *circle1, CIRCLE *circle2);
  293. extern bool circle_ne(CIRCLE *circle1, CIRCLE *circle2);
  294. extern bool circle_lt(CIRCLE *circle1, CIRCLE *circle2);
  295. extern bool circle_gt(CIRCLE *circle1, CIRCLE *circle2);
  296. extern bool circle_le(CIRCLE *circle1, CIRCLE *circle2);
  297. extern bool circle_ge(CIRCLE *circle1, CIRCLE *circle2);
  298. extern bool circle_contain_pt(CIRCLE *circle, Point *point);
  299. extern bool pt_contained_circle(Point *point, CIRCLE *circle);
  300. extern CIRCLE *circle_add_pt(CIRCLE *circle, Point *point);
  301. extern CIRCLE *circle_sub_pt(CIRCLE *circle, Point *point);
  302. extern CIRCLE *circle_mul_pt(CIRCLE *circle, Point *point);
  303. extern CIRCLE *circle_div_pt(CIRCLE *circle, Point *point);
  304. extern double *circle_diameter(CIRCLE *circle);
  305. extern double *circle_radius(CIRCLE *circle);
  306. extern double *circle_distance(CIRCLE *circle1, CIRCLE *circle2);
  307. extern double *dist_pc(Point *point, CIRCLE *circle);
  308. extern double *dist_cpoly(CIRCLE *circle, POLYGON *poly);
  309. extern Point *circle_center(CIRCLE *circle);
  310. extern CIRCLE *circle(Point *center, float8 *radius);
  311. extern CIRCLE *box_circle(BOX *box);
  312. extern BOX *circle_box(CIRCLE *circle);
  313. extern CIRCLE *poly_circle(POLYGON *poly);
  314. extern POLYGON *circle_poly(int npts, CIRCLE *circle);
  315. /* private routines */
  316. extern double *circle_area(CIRCLE *circle);
  317. extern double circle_dt(CIRCLE *circle1, CIRCLE *circle2);
  318. /* geo_selfuncs.c */
  319. extern float64 areasel(Oid opid, Oid relid, AttrNumber attno,
  320. char *value, int32 flag);
  321. extern float64 areajoinsel(Oid opid, Oid relid1, AttrNumber attno1,
  322. Oid relid2, AttrNumber attno2);
  323. #endif  /* GEO_DECLS_H */