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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * rtproc.c
  4.  *   pg_amproc entries for rtrees.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/access/rtree/rtproc.c,v 1.18.2.1 1999/08/02 05:24:44 scrappy Exp $
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "utils/builtins.h"
  16. BOX
  17.    *
  18. rt_box_union(BOX *a, BOX *b)
  19. {
  20. BOX    *n;
  21. if ((n = (BOX *) palloc(sizeof(*n))) == (BOX *) NULL)
  22. elog(ERROR, "Cannot allocate box for union");
  23. n->high.x = Max(a->high.x, b->high.x);
  24. n->high.y = Max(a->high.y, b->high.y);
  25. n->low.x = Min(a->low.x, b->low.x);
  26. n->low.y = Min(a->low.y, b->low.y);
  27. return n;
  28. }
  29. BOX *
  30. rt_box_inter(BOX *a, BOX *b)
  31. {
  32. BOX    *n;
  33. if ((n = (BOX *) palloc(sizeof(*n))) == (BOX *) NULL)
  34. elog(ERROR, "Cannot allocate box for union");
  35. n->high.x = Min(a->high.x, b->high.x);
  36. n->high.y = Min(a->high.y, b->high.y);
  37. n->low.x = Max(a->low.x, b->low.x);
  38. n->low.y = Max(a->low.y, b->low.y);
  39. if (n->high.x < n->low.x || n->high.y < n->low.y)
  40. {
  41. pfree(n);
  42. return (BOX *) NULL;
  43. }
  44. return n;
  45. }
  46. void
  47. rt_box_size(BOX *a, float *size)
  48. {
  49. if (a == (BOX *) NULL || a->high.x <= a->low.x || a->high.y <= a->low.y)
  50. *size = 0.0;
  51. else
  52. *size = (float) ((a->high.x - a->low.x) * (a->high.y - a->low.y));
  53. return;
  54. }
  55. /*
  56.  * rt_bigbox_size() -- Compute a size for big boxes.
  57.  *
  58.  * In an earlier release of the system, this routine did something
  59.  * different from rt_box_size.  We now use floats, rather than ints,
  60.  * as the return type for the size routine, so we no longer need to
  61.  * have a special return type for big boxes.
  62.  */
  63. void
  64. rt_bigbox_size(BOX *a, float *size)
  65. {
  66. rt_box_size(a, size);
  67. }
  68. POLYGON    *
  69. rt_poly_union(POLYGON *a, POLYGON *b)
  70. {
  71. POLYGON    *p;
  72. p = (POLYGON *) palloc(sizeof(POLYGON));
  73. if (!PointerIsValid(p))
  74. elog(ERROR, "Cannot allocate polygon for union");
  75. MemSet((char *) p, 0, sizeof(POLYGON)); /* zero any holes */
  76. p->size = sizeof(POLYGON);
  77. p->npts = 0;
  78. p->boundbox.high.x = Max(a->boundbox.high.x, b->boundbox.high.x);
  79. p->boundbox.high.y = Max(a->boundbox.high.y, b->boundbox.high.y);
  80. p->boundbox.low.x = Min(a->boundbox.low.x, b->boundbox.low.x);
  81. p->boundbox.low.y = Min(a->boundbox.low.y, b->boundbox.low.y);
  82. return p;
  83. }
  84. void
  85. rt_poly_size(POLYGON *a, float *size)
  86. {
  87. double xdim,
  88. ydim;
  89. size = (float *) palloc(sizeof(float));
  90. if (a == (POLYGON *) NULL ||
  91. a->boundbox.high.x <= a->boundbox.low.x ||
  92. a->boundbox.high.y <= a->boundbox.low.y)
  93. *size = 0.0;
  94. else
  95. {
  96. xdim = (a->boundbox.high.x - a->boundbox.low.x);
  97. ydim = (a->boundbox.high.y - a->boundbox.low.y);
  98. *size = (float) (xdim * ydim);
  99. }
  100. return;
  101. }
  102. POLYGON    *
  103. rt_poly_inter(POLYGON *a, POLYGON *b)
  104. {
  105. POLYGON    *p;
  106. p = (POLYGON *) palloc(sizeof(POLYGON));
  107. if (!PointerIsValid(p))
  108. elog(ERROR, "Cannot allocate polygon for intersection");
  109. MemSet((char *) p, 0, sizeof(POLYGON)); /* zero any holes */
  110. p->size = sizeof(POLYGON);
  111. p->npts = 0;
  112. p->boundbox.high.x = Min(a->boundbox.high.x, b->boundbox.high.x);
  113. p->boundbox.high.y = Min(a->boundbox.high.y, b->boundbox.high.y);
  114. p->boundbox.low.x = Max(a->boundbox.low.x, b->boundbox.low.x);
  115. p->boundbox.low.y = Max(a->boundbox.low.y, b->boundbox.low.y);
  116. if (p->boundbox.high.x < p->boundbox.low.x || p->boundbox.high.y < p->boundbox.low.y)
  117. {
  118. pfree(p);
  119. return (POLYGON *) NULL;
  120. }
  121. return p;
  122. }