diff --git a/src/main/org/insa/graph/GraphStatistics.java b/src/main/org/insa/graph/GraphStatistics.java index 9e98023..a6c24ef 100644 --- a/src/main/org/insa/graph/GraphStatistics.java +++ b/src/main/org/insa/graph/GraphStatistics.java @@ -10,6 +10,46 @@ package org.insa.graph; */ public class GraphStatistics { + /** + * Class representing a bounding box for a graph (a rectangle that contains all + * nodes in the graph). + * + */ + public static class BoundingBox { + + private final Point topLeft, bottomRight; + + /** + * Create a new BoundingBox represented by the given top-left and bottom-right + * points. + * + * @param topLeft Top left corner of the bounding box. + * @param bottomRight Bottom right corner of the bounding box. + */ + public BoundingBox(Point topLeft, Point bottomRight) { + this.topLeft = topLeft; + this.bottomRight = bottomRight; + } + + /** + * @return Bottom-right point of this boundin box. + */ + public Point getBottomRightPoint() { + return bottomRight; + } + + /** + * @return Top-left point of this bounding box. + */ + public Point getTopLeftPoint() { + return topLeft; + } + + } + + // Bounding box for this graph. + private final BoundingBox boundingBox; + // Maximum speed on this graph (in kmph). private final int maximumSpeed; @@ -20,17 +60,25 @@ public class GraphStatistics { * Create a new GraphStatistics instance with the given value. * * @param maximumSpeed Maximum speed of any road of the graph. A value of 0 may - * be used to indicate that this graph has no maximum limitation. + * be used to indicate that this graph has no maximum limitation. * @param maximumLength Maximum length of any arc of the graph. */ - public GraphStatistics(int maximumSpeed, float maximumLength) { + public GraphStatistics(BoundingBox boundingBox, int maximumSpeed, float maximumLength) { + this.boundingBox = boundingBox; this.maximumLength = maximumLength; this.maximumSpeed = maximumSpeed; } + /** + * @return The bounding box for this graph. + */ + public BoundingBox getBoundingBox() { + return this.boundingBox; + } + /** * @return Maximum speed of any arc in the graph, or 0 if some road have no - * speed limitations. + * speed limitations. */ public int getMaximumSpeed() { return this.maximumSpeed; diff --git a/src/main/org/insa/graph/io/BinaryGraphReader.java b/src/main/org/insa/graph/io/BinaryGraphReader.java index 4495c27..c439953 100644 --- a/src/main/org/insa/graph/io/BinaryGraphReader.java +++ b/src/main/org/insa/graph/io/BinaryGraphReader.java @@ -12,6 +12,7 @@ import org.insa.graph.AccessRestrictions.AccessRestriction; import org.insa.graph.Arc; import org.insa.graph.Graph; import org.insa.graph.GraphStatistics; +import org.insa.graph.GraphStatistics.BoundingBox; import org.insa.graph.Node; import org.insa.graph.Point; import org.insa.graph.RoadInformation; @@ -49,7 +50,7 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader { // the order correspond to the 4 bits value (i.e. FORBIDDEN is 0 or PRIVATE is // 2) - UKNOWN is not included because value above 6 (FORESTRY) are all // considered unknown. - final AccessRestriction[] allRestrictions = new AccessRestriction[]{ + final AccessRestriction[] allRestrictions = new AccessRestriction[] { AccessRestriction.FORBIDDEN, AccessRestriction.ALLOWED, AccessRestriction.PRIVATE, AccessRestriction.DESTINATION, AccessRestriction.DELIVERY, AccessRestriction.CUSTOMERS, AccessRestriction.FORESTRY }; @@ -57,7 +58,7 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader { // The order of values inside this array is VERY IMPORTANT: The order is such // that each 4-bits group of the long value is processed in the correct order, // i.e. FOOT is processed first (4 lowest bits), and so on. - final AccessMode[] allModes = new AccessMode[]{ AccessMode.FOOT, null, AccessMode.BICYCLE, + final AccessMode[] allModes = new AccessMode[] { AccessMode.FOOT, null, AccessMode.BICYCLE, AccessMode.SMALL_MOTORCYCLE, AccessMode.AGRICULTURAL, AccessMode.MOTORCYCLE, AccessMode.MOTORCAR, AccessMode.HEAVY_GOODS, null, AccessMode.PUBLIC_TRANSPORT }; @@ -179,12 +180,25 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader { ArrayList nodes = new ArrayList(nbNodes); // Read nodes. + float minLongitude = Float.POSITIVE_INFINITY, minLatitude = Float.POSITIVE_INFINITY, + maxLongitude = Float.NEGATIVE_INFINITY, maxLatitude = Float.NEGATIVE_INFINITY; observers.forEach((observer) -> observer.notifyStartReadingNodes(nbNodes)); for (int node = 0; node < nbNodes; ++node) { + // Read longitude / latitude. float longitude = ((float) dis.readInt()) / 1E6f; float latitude = ((float) dis.readInt()) / 1E6f; + + // Update minimum / maximum. + minLongitude = Math.min(longitude, minLongitude); + minLatitude = Math.min(latitude, minLatitude); + maxLongitude = Math.max(longitude, maxLongitude); + maxLatitude = Math.max(latitude, maxLatitude); + + // Update information. nbSuccessors[node] = dis.readUnsignedByte(); nbTotalSuccessors += nbSuccessors[node]; + + // Create node. final Node aNode = new Node(node, new Point(longitude, latitude)); nodes.add(aNode); observers.forEach((observer) -> observer.notifyNewNodeRead(aNode)); @@ -270,7 +284,9 @@ public class BinaryGraphReader extends BinaryReader implements GraphReader { this.dis.close(); - return new Graph(mapId, mapName, nodes, new GraphStatistics(maxSpeed, maxLength)); + return new Graph(mapId, mapName, nodes, + new GraphStatistics(new BoundingBox(new Point(minLongitude, maxLatitude), + new Point(maxLongitude, minLatitude)), maxSpeed, maxLength)); } /** diff --git a/src/main/org/insa/graphics/drawing/components/BasicDrawing.java b/src/main/org/insa/graphics/drawing/components/BasicDrawing.java index b512699..46495c0 100644 --- a/src/main/org/insa/graphics/drawing/components/BasicDrawing.java +++ b/src/main/org/insa/graphics/drawing/components/BasicDrawing.java @@ -23,6 +23,7 @@ import javax.swing.JPanel; import org.insa.graph.Arc; import org.insa.graph.Graph; +import org.insa.graph.GraphStatistics.BoundingBox; import org.insa.graph.Node; import org.insa.graph.Path; import org.insa.graph.Point; @@ -394,6 +395,7 @@ public class BasicDrawing extends JPanel implements Drawing { /* * (non-Javadoc) + * * @see org.insa.graphics.drawing.Drawing#clear() */ @Override @@ -409,6 +411,7 @@ public class BasicDrawing extends JPanel implements Drawing { /* * (non-Javadoc) + * * @see org.insa.graphics.drawing.Drawing#clearOverlays() */ @Override @@ -469,6 +472,7 @@ public class BasicDrawing extends JPanel implements Drawing { /* * (non-Javadoc) + * * @see * org.insa.graphics.drawing.Drawing#addDrawingClickListener(org.insa.graphics. * drawing.DrawingClickListener) @@ -480,6 +484,7 @@ public class BasicDrawing extends JPanel implements Drawing { /* * (non-Javadoc) + * * @see org.insa.graphics.drawing.Drawing#removeDrawingClickListener(org.insa. * graphics.drawing.DrawingClickListener) */ @@ -523,7 +528,7 @@ public class BasicDrawing extends JPanel implements Drawing { * * @param arc Arc to draw. * @param palette Palette to use to retrieve color and width for arc, or null to - * use current settings. + * use current settings. */ protected void drawArc(Arc arc, GraphPalette palette, boolean repaint) { List pts = arc.getPoints(); @@ -561,24 +566,13 @@ public class BasicDrawing extends JPanel implements Drawing { // Clear everything. this.clear(); + BoundingBox box = graph.getGraphInformation().getBoundingBox(); + // Find minimum/maximum longitude and latitude. - double minLon = Double.POSITIVE_INFINITY, minLat = Double.POSITIVE_INFINITY, - maxLon = Double.NEGATIVE_INFINITY, maxLat = Double.NEGATIVE_INFINITY; - for (Node node: graph.getNodes()) { - Point pt = node.getPoint(); - if (pt.getLatitude() < minLat) { - minLat = pt.getLatitude(); - } - if (pt.getLatitude() > maxLat) { - maxLat = pt.getLatitude(); - } - if (pt.getLongitude() < minLon) { - minLon = pt.getLongitude(); - } - if (pt.getLongitude() > maxLon) { - maxLon = pt.getLongitude(); - } - } + double minLon = box.getTopLeftPoint().getLongitude(), + maxLon = box.getBottomRightPoint().getLongitude(), + minLat = box.getBottomRightPoint().getLatitude(), + maxLat = box.getTopLeftPoint().getLatitude(); // Add a little delta to avoid drawing on the edge... double diffLon = maxLon - minLon, diffLat = maxLat - minLat;