205 lines
6.2 KiB
Java
205 lines
6.2 KiB
Java
package org.insa.graph;
|
|
|
|
/**
|
|
* <p>
|
|
* Utility class that stores some statistics of graphs that are not easy to
|
|
* access.
|
|
* </p>
|
|
*
|
|
* <p>
|
|
* This class is used to provide constant ({@code O(1)}) access to information
|
|
* in graph that do not change, and that usually require linear complexity to
|
|
* compute.
|
|
* </p>
|
|
*
|
|
*/
|
|
public class GraphStatistics {
|
|
|
|
/**
|
|
* Special value used to indicate that the graph has no maximum speed limit
|
|
* (some roads are not limited).
|
|
*
|
|
*/
|
|
public static final int NO_MAXIMUM_SPEED = -1;
|
|
|
|
/**
|
|
* 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 bounding box.
|
|
*/
|
|
public Point getBottomRightPoint() {
|
|
return bottomRight;
|
|
}
|
|
|
|
/**
|
|
* @return Top-left point of this bounding box.
|
|
*/
|
|
public Point getTopLeftPoint() {
|
|
return topLeft;
|
|
}
|
|
|
|
/**
|
|
* Create a new bounding box by extending the current one according to the given
|
|
* value for each side.
|
|
*
|
|
* @param left Extra size to add to the left of the box.
|
|
* @param top Extra size to add to the top of the box.
|
|
* @param right Extra size to add to the right of the box.
|
|
* @param bottom Extra size to add to the bottom of the box.
|
|
*
|
|
* @return New bounding box corresponding to an extension of the current one.
|
|
*/
|
|
public BoundingBox extend(float left, float top, float right, float bottom) {
|
|
return new BoundingBox(
|
|
new Point(this.topLeft.getLongitude() - left, this.topLeft.getLatitude() + top),
|
|
new Point(this.bottomRight.getLongitude() + right,
|
|
this.bottomRight.getLatitude() - bottom));
|
|
}
|
|
|
|
/**
|
|
* Create a new bounding box by extending the current one according by the given
|
|
* value on each side.
|
|
*
|
|
* @param size Extra size to add to each side of this box.
|
|
*
|
|
* @return New bounding box corresponding to an extension of the current one.
|
|
*/
|
|
public BoundingBox extend(float size) {
|
|
return this.extend(size, size, size, size);
|
|
}
|
|
|
|
/**
|
|
* @param point Point to check
|
|
*
|
|
* @return true if this box contains the given point.
|
|
*/
|
|
public boolean contains(Point point) {
|
|
return this.bottomRight.getLatitude() <= point.getLatitude()
|
|
&& this.topLeft.getLatitude() >= point.getLatitude()
|
|
&& this.topLeft.getLongitude() <= point.getLongitude()
|
|
&& this.bottomRight.getLongitude() >= point.getLongitude();
|
|
}
|
|
|
|
/**
|
|
* @param other Box to intersect.
|
|
*
|
|
* @return true if this box contains the given box.
|
|
*/
|
|
public boolean contains(BoundingBox other) {
|
|
return this.contains(other.bottomRight) && this.contains(other.topLeft);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "BoundingBox(topLeft=" + this.topLeft + ", bottomRight=" + this.bottomRight
|
|
+ ")";
|
|
}
|
|
|
|
}
|
|
|
|
// Bounding box for this graph.
|
|
private final BoundingBox boundingBox;
|
|
|
|
// Number of roads
|
|
private final int nbRoadOneWay, nbRoadTwoWays;
|
|
|
|
// Maximum speed on this graph (in kmph).
|
|
private final int maximumSpeed;
|
|
|
|
// Maximum length of any arc on this graph.
|
|
private final float maximumLength;
|
|
|
|
/**
|
|
* Create a new GraphStatistics instance with the given value.
|
|
*
|
|
* @param boundingBox Bounding-box for the graph.
|
|
* @param nbRoadOneWay Number of one-way roads in the graph.
|
|
* @param nbRoadTwoWays Number of two-ways roads in the graph.
|
|
* @param maximumSpeed Maximum speed of any road of the graph. You can use
|
|
* {@link #NO_MAXIMUM_SPEED} to indicate that the graph has no maximum
|
|
* speed limit.
|
|
* @param maximumLength Maximum length of any arc of the graph.
|
|
*/
|
|
public GraphStatistics(BoundingBox boundingBox, int nbRoadOneWay, int nbRoadTwoWays,
|
|
int maximumSpeed, float maximumLength) {
|
|
this.boundingBox = boundingBox;
|
|
this.nbRoadOneWay = nbRoadOneWay;
|
|
this.nbRoadTwoWays = nbRoadTwoWays;
|
|
this.maximumLength = maximumLength;
|
|
this.maximumSpeed = maximumSpeed;
|
|
}
|
|
|
|
/**
|
|
* @return The bounding box for this graph.
|
|
*/
|
|
public BoundingBox getBoundingBox() {
|
|
return this.boundingBox;
|
|
}
|
|
|
|
/**
|
|
* @return Amount of one-way roads in this graph.
|
|
*/
|
|
public int getOneWayRoadCount() {
|
|
return this.nbRoadOneWay;
|
|
}
|
|
|
|
/**
|
|
* @return Amount of two-ways roads in this graph.
|
|
*/
|
|
public int getTwoWaysRoadCount() {
|
|
return this.nbRoadTwoWays;
|
|
}
|
|
|
|
/**
|
|
* @return Number of arcs in this graph.
|
|
*
|
|
* @see #getOneWayRoadCount()
|
|
* @see #getTwoWaysRoadCount()
|
|
*/
|
|
public int getArcCount() {
|
|
return getOneWayRoadCount() + 2 * getTwoWaysRoadCount();
|
|
}
|
|
|
|
/**
|
|
* @return true if this graph has a maximum speed limit, false otherwise.
|
|
*/
|
|
public boolean hasMaximumSpeed() {
|
|
return this.maximumLength != NO_MAXIMUM_SPEED;
|
|
}
|
|
|
|
/**
|
|
* @return Maximum speed of any arc in the graph, or {@link #NO_MAXIMUM_SPEED}
|
|
* if some roads have no speed limitation.
|
|
*/
|
|
public int getMaximumSpeed() {
|
|
return this.maximumSpeed;
|
|
}
|
|
|
|
/**
|
|
* @return Maximum length of any arc in the graph.
|
|
*/
|
|
public float getMaximumLength() {
|
|
return this.maximumLength;
|
|
}
|
|
|
|
}
|