diff --git a/OsmAnd-java/src/main/java/net/osmand/data/QuadRect.java b/OsmAnd-java/src/main/java/net/osmand/data/QuadRect.java index a0b8259b2b..1b5e97bebe 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/QuadRect.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/QuadRect.java @@ -6,6 +6,7 @@ public class QuadRect { public double top; public double bottom; + // left & right / top & bottom could be flipped (so it's useful for latlon bbox) public QuadRect(double left, double top, double right, double bottom) { this.left = left; this.right = right; @@ -21,16 +22,18 @@ public class QuadRect { } public double width() { - return right - left; + return Math.abs(right - left); } public double height() { - return bottom - top; + return Math.abs(bottom - top); } public boolean contains(double left, double top, double right, double bottom) { - return this.left < this.right && this.top < this.bottom && this.left <= left && this.top <= top && this.right >= right - && this.bottom >= bottom; + return Math.min(this.left, this.right) <= Math.min(left, right) + && Math.max(this.left, this.right) >= Math.max(left, right) + && Math.min(this.top, this.bottom) <= Math.min(top, bottom) + && Math.max(this.top, this.bottom) <= Math.max(top, bottom); } public boolean contains(QuadRect box) { @@ -38,11 +41,10 @@ public class QuadRect { } public static boolean intersects(QuadRect a, QuadRect b) { - return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom; - } - - public static boolean trivialOverlap(QuadRect a, QuadRect b) { - return !((a.right < b.left) || (a.left > b.right) || (a.top < b.bottom) || (a.bottom > b.top)); + return Math.min(a.left, a.right) < Math.max(b.left, b.right) + && Math.max(a.left, a.right) > Math.min(b.left, b.right) + && Math.min(a.bottom, a.top) < Math.max(b.bottom, b.top) + && Math.max(a.bottom, a.top) > Math.min(b.bottom, b.top); } public double centerX() { diff --git a/OsmAnd-java/src/main/java/net/osmand/data/QuadTree.java b/OsmAnd-java/src/main/java/net/osmand/data/QuadTree.java index 2b8f0db066..9ed98d06a9 100644 --- a/OsmAnd-java/src/main/java/net/osmand/data/QuadTree.java +++ b/OsmAnd-java/src/main/java/net/osmand/data/QuadTree.java @@ -103,18 +103,16 @@ public class QuadTree { void splitBox(QuadRect node_extent, QuadRect[] n) { // coord2d c=node_extent.center(); - double width = node_extent.width(); - double height = node_extent.height(); - double lox = node_extent.left; - double loy = node_extent.top; - double hix = node_extent.right; - double hiy = node_extent.bottom; + double lx = node_extent.left; + double ly = node_extent.top; + double hx = node_extent.right; + double hy = node_extent.bottom; - n[0] = new QuadRect(lox, loy, lox + width * ratio, loy + height * ratio); - n[1] = new QuadRect(hix - width * ratio, loy, hix, loy + height * ratio); - n[2] = new QuadRect(lox, hiy - height * ratio, lox + width * ratio, hiy); - n[3] = new QuadRect(hix - width * ratio, hiy - height * ratio, hix, hiy); + n[0] = new QuadRect(lx, ly, lx + (hx - lx) * ratio, ly + (hy - ly) * ratio); + n[1] = new QuadRect(lx + (hx - lx) * (1 - ratio), ly, hx, ly + (hy - ly) * ratio); + n[2] = new QuadRect(lx, ly + (hy - ly) * (1 - ratio), lx + (hx - lx) * ratio, hy); + n[3] = new QuadRect(lx + (hx - lx) * (1 - ratio), ly + (hy - ly) * (1 - ratio), hx, hy); } }