package edu.hawaii.ics.yucheng; import java.security.InvalidParameterException; /** * A class that builds a graph. */ class GraphBuilder { /** * Returns true if a valid exceeds a range. * * @param value The value. * * @param low The low value (inclusive). * * @param high The high value (inclusive). * * @return True indicates the value exceeds the range. */ private static boolean exceeds(final int value, final int low, final int high) { return value < low || value > high; } /** The height of the mesh graph. */ public final int height; /** The base location. */ private Vertex myBase; /** The initial battery capacity. */ private int myCapacity; /** The array of battery consumption values. */ private final int[] myConsumptions; /** The array of obstacles. */ private final boolean[] myObstacles; /** The array of priority values. */ private final int[] myPriorities; /** The width of the mesh graph. */ public final int width; /** * Initializes a new instance of the class. * * @param width The width of the graph. * * @param height The height of the graph. */ public GraphBuilder(final int width, final int height) { if (width < 1) throw new InvalidParameterException("width"); if (height < 1) throw new InvalidParameterException("height"); this.width = width; this.height = height; myConsumptions = new int[width * height]; myObstacles = new boolean[width * height]; myPriorities = new int[width * height]; myCapacity = 0; myBase = new Vertex(0, 0); } /** * Returns the base location. * * @return The base location. */ public Vertex base() { return myBase; } /** * Returns the initial battery capacity. * * @return The initial battery capacity. */ public int capacity() { return myCapacity; } /** * Returns the battery consumption value at a specified location. * * @param x The x coordinate. * * @param y The y coordinate. * * @return The battery consumption value. */ public int consumption(final int x, final int y) { return myConsumptions[indexOf(x, y)]; } /** * Returns the array index at a specified location. * * @param x The x coordinate. * * @param y The y coordinate. * * @return The array index. */ private int indexOf(final int x, final int y) { if (exceeds(x, 0, width - 1)) throw new IndexOutOfBoundsException("x"); if (exceeds(y, 0, height - 1)) throw new IndexOutOfBoundsException("y"); return width * y + x; } /** * Returns true if a specified location is an obstacle. * * @param x The x coordinate. * * @param y The y coordinate. * * @return True indicates the specified location is an obstacle. */ public boolean obstacle(final int x, final int y) { return myObstacles[indexOf(x, y)]; } /** * Returns the priority value at a specified location. * * @param x The x coordinate. * * @param y The y coordinate. * * @return Returns the priority value at a specified location. */ public int priority(final int x, final int y) { return myPriorities[indexOf(x, y)]; } /** * Sets the base location. * * @param x The x coordinate. * * @param y The y coordinate. */ public void setBase(final int x, final int y) { indexOf(x, y); myBase = new Vertex(x, y); } /** * Sets the initial battery capacity. * * @param capacity The battery capacity. */ public void setCapacity(final int capacity) { if (capacity < 0) throw new IllegalArgumentException("capacity"); myCapacity = capacity; } /** * Sets the battery consumption value at a specified location. * * @param x The x coordinate. * * @param y The y coordinate. * * @param value The battery consumption value. */ public void setConsumption(final int x, final int y, final int value) { if (value < 0) throw new IllegalArgumentException("value"); myConsumptions[indexOf(x, y)] = value; } /** * Sets or unsets an obstacle at a specified location. * * @param x The x coordinate. * * @param y The y coordinate. * * @param value True indicates there is an obstacle at the location. */ public void setObstacle(final int x, final int y, final boolean value) { myObstacles[indexOf(x, y)] = value; } /** * Sets the priority value at a specified location. * * @param x The x coordinate. * * @param y The y coordinate. * * @param value The priority value. */ public void setPriority(final int x, final int y, final int value) { if (value < 0) throw new IllegalArgumentException("value"); myPriorities[indexOf(x, y)] = value; } /** * Returns an immutable graph based on this class data. * * @return A graph. */ public Graph toGraph() { return new Graph(this); } }