Changeset: 945d4284f09b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=945d4284f09b
Modified Files:
        geom/monetdb5/geom.c
Branch: geo
Log Message:

implemented functions for testing the relative positions of mbrs
+ function for returing the distance of the centroids of two mbrs


diffs (158 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -170,7 +170,19 @@ geom_export str wkbTransform(wkb**, wkb*
 geom_export str geom_2_geom(wkb** resWKB, wkb **valueWKB, int* columnType, 
int* columnSRID); 
 
 geom_export str wkbMBR(mbr **res, wkb **geom);
+geom_export str mbrAbove(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrBelow(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrContained(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrContains(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrDistance(double *out, mbr **b1, mbr **b2);
+geom_export str mbrEqual(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrLeft(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrAbove(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrBelow(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrLeft(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrOverlapOrRight(bit *out, mbr **b1, mbr **b2);
 geom_export str mbrOverlaps(bit *out, mbr **b1, mbr **b2);
+geom_export str mbrRight(bit *out, mbr **b1, mbr **b2);
 geom_export str wkbCoordinateFromWKB(dbl*, wkb**, int*);
 geom_export str wkbCoordinateFromMBR(dbl*, mbr**, int*);
 
@@ -2117,15 +2129,132 @@ str wkbMBR(mbr **geomMBR, wkb **geomWKB)
        return MAL_SUCCEED;     
 }
 
-/*checks whether two mbrs overlap */
+/* returns true if b1 is above b2 */
+str mbrAbove(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ((*b1)->ymin >(*b2)->ymax); 
+       return MAL_SUCCEED;
+}
+
+/* returns true if b1 is below b2 */
+str mbrBelow(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ( (*b1)->ymax < (*b2)->ymin);
+       return MAL_SUCCEED;
+}
+
+/* returns true if box1 is left of box2 */
+str mbrLeft(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ( (*b1)->xmax < (*b2)->xmin );
+       return MAL_SUCCEED;
+}
+
+/* returns true if box1 is right of box2 */
+str mbrRight(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else 
+               *out = ( (*b1)->xmin > (*b2)->xmax );
+       return MAL_SUCCEED;
+}
+
+/* returns true if b1 is contained in b2 */
+str mbrContained(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ( ((*b1)->xmin > (*b2)->xmin) && ((*b1)->xmax < 
(*b2)->xmax) && ((*b1)->ymin > (*b2)->ymin) && ((*b1)->ymax < (*b2)->ymax));
+       return MAL_SUCCEED;
+}
+
+/*returns true if b1 contains b2 */
+str mbrContains(bit *out, mbr **b1, mbr **b2) {
+       return mbrContained(out, b2, b1);
+}
+
+/* returns the Euclidean distance of the centroids of the boxes */
+str mbrDistance(double *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2)) {
+               *out = 0;
+               return MAL_SUCCEED;
+       }
+
+       //compute the centroids of the two polygons
+       double b1_Cx = ((*b1)->xmin+(*b1)->xmax)/2.0;
+       double b1_Cy = ((*b1)->ymin+(*b1)->ymax)/2.0;
+       double b2_Cx = ((*b2)->xmin+(*b2)->xmax)/2.0;
+       double b2_Cy = ((*b2)->ymin+(*b2)->ymax)/2.0;
+
+       //compute the euclidean distance
+       *out = sqrt( pow(b1_Cx*b2_Cx, 2.0) + pow(b1_Cy*b2_Cy, 2.0));
+
+       return MAL_SUCCEED;
+}
+
+/* returns true if the boxes are the same */
+str mbrEqual(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) && mbr_isnil(*b2))
+               *out = 1;
+       else if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ( ((*b1)->xmin == (*b2)->xmin) && ((*b1)->xmax == 
(*b2)->xmax) && ((*b1)->ymin == (*b2)->ymin) && ((*b1)->ymax == (*b2)->ymax));
+       return MAL_SUCCEED;
+}
+
+/*returns true if the two mbrs overlap */
 str mbrOverlaps(bit *out, mbr **b1, mbr **b2) {
        if (mbr_isnil(*b1) || mbr_isnil(*b2))
                *out = 0;
-       else
+       else //they cannot overlap if b2 is left, right, above or below b1
                *out = !((*b2)->ymax < (*b1)->ymin || (*b2)->ymin > (*b1)->ymax 
|| (*b2)->xmax < (*b1)->xmin || (*b2)->xmin > (*b1)->xmax);
        return MAL_SUCCEED;
 }
 
+/* returns true if box1 overlaps or is above box2 when only the Y coordinate 
is considered*/
+str mbrOverlapOrAbove(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out =  ((*b1)->ymin >= (*b2)->ymin);
+       return MAL_SUCCEED;
+}
+
+/* returns true if box1 overlaps or is below box2 when only the Y coordinate 
is considered*/
+str mbrOverlapOrBelow(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ((*b1)->ymax <= (*b2)->ymax);
+       return MAL_SUCCEED;
+}
+
+/* returns true if box1 overlaps or is left of box2 when only the X coordinate 
is considered*/
+str mbrOverlapOrLeft(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ((*b1)->xmax <= (*b2)->xmax);
+       return MAL_SUCCEED;
+}
+
+/* returns true if box1 overlaps or is right of box2 when only the X 
coordinate is considered*/
+str mbrOverlapOrRight(bit *out, mbr **b1, mbr **b2) {
+       if (mbr_isnil(*b1) || mbr_isnil(*b2))
+               *out = 0;
+       else
+               *out = ((*b1)->xmin >= (*b2)->xmin);
+       return MAL_SUCCEED;
+}
+
+
 /* get Xmin, Ymin, Xmax, Ymax coordinates of mbr */
 str wkbCoordinateFromMBR(dbl* coordinateValue, mbr** geomMBR, int* 
coordinateIdx) {
        switch(*coordinateIdx) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to