be-graphes/src/main/org/insa/graph/GraphStatistics.java
2019-03-18 21:34:20 +01:00

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;
}
}