summaryrefslogtreecommitdiff
path: root/sql/spatial.h
diff options
context:
space:
mode:
authortsmith@siva.hindu.god <>2007-03-23 17:48:03 -0600
committertsmith@siva.hindu.god <>2007-03-23 17:48:03 -0600
commitbd5012a8ca12286ff70b8e77a217c7826d1ce329 (patch)
tree9f87aa9e4a9ff0b87fbd824715ac574410c05162 /sql/spatial.h
parent772a76a78d09cba3f70641b0b433327ac88dd1a0 (diff)
parent47cce188b369b2dd77c14f483128430a63a3c7ac (diff)
downloadmariadb-git-bd5012a8ca12286ff70b8e77a217c7826d1ce329.tar.gz
Merge siva.hindu.god:/home/tsmith/m/bk/maint/bmisc/50
into siva.hindu.god:/home/tsmith/m/bk/maint/bmisc/51
Diffstat (limited to 'sql/spatial.h')
-rw-r--r--sql/spatial.h43
1 files changed, 37 insertions, 6 deletions
diff --git a/sql/spatial.h b/sql/spatial.h
index 0c0452b5abc..f806861290e 100644
--- a/sql/spatial.h
+++ b/sql/spatial.h
@@ -144,15 +144,46 @@ struct MBR
return (xmin<x) && (xmax>x) && (ymin<y) && (ymax>y);
}
+ /**
+ The dimension maps to an integer as:
+ - Polygon -> 2
+ - Horizontal or vertical line -> 1
+ - Point -> 0
+ - Invalid MBR -> -1
+ */
+ int dimension() const
+ {
+ int d= 0;
+
+ if (xmin > xmax)
+ return -1;
+ else if (xmin < xmax)
+ d++;
+
+ if (ymin > ymax)
+ return -1;
+ else if (ymin < ymax)
+ d++;
+
+ return d;
+ }
+
int overlaps(const MBR *mbr)
{
- int lb= mbr->inner_point(xmin, ymin);
- int rb= mbr->inner_point(xmax, ymin);
- int rt= mbr->inner_point(xmax, ymax);
- int lt= mbr->inner_point(xmin, ymax);
+ /*
+ overlaps() requires that some point inside *this is also inside
+ *mbr, and that both geometries and their intersection are of the
+ same dimension.
+ */
+ int d = dimension();
+
+ if (d != mbr->dimension() || d <= 0 || contains(mbr) || within(mbr))
+ return 0;
+
+ MBR intersection(max(xmin, mbr->xmin), max(ymin, mbr->ymin),
+ min(xmax, mbr->xmax), min(ymax, mbr->ymax));
- int a = lb+rb+rt+lt;
- return (a>0) && (a<4) && (!within(mbr));
+ return (d == intersection.dimension());
}
};