diff options
Diffstat (limited to 'main/src/cgeo/geocaching/geopoint/Viewport.java')
| -rw-r--r-- | main/src/cgeo/geocaching/geopoint/Viewport.java | 68 |
1 files changed, 29 insertions, 39 deletions
diff --git a/main/src/cgeo/geocaching/geopoint/Viewport.java b/main/src/cgeo/geocaching/geopoint/Viewport.java index 9d55f69..ba0e040 100644 --- a/main/src/cgeo/geocaching/geopoint/Viewport.java +++ b/main/src/cgeo/geocaching/geopoint/Viewport.java @@ -5,16 +5,15 @@ import cgeo.geocaching.ICoordinates; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import java.util.Set; +import java.util.Collection; - -public class Viewport { +public final class Viewport { public final @NonNull Geopoint center; public final @NonNull Geopoint bottomLeft; public final @NonNull Geopoint topRight; - public Viewport(final ICoordinates point1, final ICoordinates point2) { + public Viewport(final @NonNull ICoordinates point1, final @NonNull ICoordinates point2) { final Geopoint gp1 = point1.getCoords(); final Geopoint gp2 = point2.getCoords(); this.bottomLeft = new Geopoint(Math.min(gp1.getLatitude(), gp2.getLatitude()), @@ -25,7 +24,7 @@ public class Viewport { (gp1.getLongitude() + gp2.getLongitude()) / 2); } - public Viewport(final ICoordinates center, final double latSpan, final double lonSpan) { + public Viewport(final @NonNull ICoordinates center, final double latSpan, final double lonSpan) { this.center = center.getCoords(); final double centerLat = this.center.getLatitude(); final double centerLon = this.center.getLongitude(); @@ -71,7 +70,7 @@ public class Viewport { * the coordinates to check * @return true if the point is contained in this viewport, false otherwise or if the point contains no coordinates */ - public boolean contains(final ICoordinates point) { + public boolean contains(final @NonNull ICoordinates point) { final Geopoint coords = point.getCoords(); return coords != null && coords.getLongitudeE6() >= bottomLeft.getLongitudeE6() @@ -87,12 +86,12 @@ public class Viewport { /** * Check whether another viewport is fully included into the current one. - * + * * @param vp * the other viewport - * @return true if the vp is fully included into this one, false otherwise + * @return true if the viewport is fully included into this one, false otherwise */ - public boolean includes(final Viewport vp) { + public boolean includes(final @NonNull Viewport vp) { return contains(vp.bottomLeft) && contains(vp.topRight); } @@ -124,46 +123,37 @@ public class Viewport { } /** - * Return a viewport that contains the current viewport as well as another point. - * - * @param point - * the point we want in the viewport - * @return either the same or an expanded viewport - */ - public Viewport expand(final ICoordinates point) { - if (contains(point)) { - return this; - } - - final Geopoint coords = point.getCoords(); - final double latitude = coords.getLatitude(); - final double longitude = coords.getLongitude(); - final double latMin = Math.min(getLatitudeMin(), latitude); - final double latMax = Math.max(getLatitudeMax(), latitude); - final double lonMin = Math.min(getLongitudeMin(), longitude); - final double lonMax = Math.max(getLongitudeMax(), longitude); - return new Viewport(new Geopoint(latMin, lonMin), new Geopoint(latMax, lonMax)); - } - - /** * Return the smallest viewport containing all the given points. * * @param points * a set of points. Point with null coordinates (or null themselves) will be ignored * @return the smallest viewport containing the non-null coordinates, or null if no coordinates are non-null */ - static public Viewport containing(final Set<? extends ICoordinates> points) { - Viewport viewport = null; + static public @Nullable + Viewport containing(final Collection<? extends ICoordinates> points) { + boolean valid = false; + double latMin = Double.MAX_VALUE; + double latMax = -Double.MAX_VALUE; + double lonMin = Double.MAX_VALUE; + double lonMax = -Double.MAX_VALUE; for (final ICoordinates point : points) { - if (point != null && point.getCoords() != null) { - if (viewport == null) { - viewport = new Viewport(point, point); - } else { - viewport = viewport.expand(point); + if (point != null) { + final Geopoint coords = point.getCoords(); + if (coords != null) { + valid = true; + final double latitude = coords.getLatitude(); + final double longitude = coords.getLongitude(); + latMin = Math.min(latMin, latitude); + latMax = Math.max(latMax, latitude); + lonMin = Math.min(lonMin, longitude); + lonMax = Math.max(lonMax, longitude); } } } - return viewport; + if (!valid) { + return null; + } + return new Viewport(new Geopoint(latMin, lonMin), new Geopoint(latMax, lonMax)); } @Override |
