diff options
author | tsmith@siva.hindu.god <> | 2007-03-23 17:48:03 -0600 |
---|---|---|
committer | tsmith@siva.hindu.god <> | 2007-03-23 17:48:03 -0600 |
commit | bd5012a8ca12286ff70b8e77a217c7826d1ce329 (patch) | |
tree | 9f87aa9e4a9ff0b87fbd824715ac574410c05162 /sql/spatial.h | |
parent | 772a76a78d09cba3f70641b0b433327ac88dd1a0 (diff) | |
parent | 47cce188b369b2dd77c14f483128430a63a3c7ac (diff) | |
download | mariadb-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.h | 43 |
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()); } }; |