Add bounding-box in GraphStatistics.
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Node> nodes = new ArrayList<Node>(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));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Point> 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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user