package contouring; /** * <p> * This object represents a single contour line or path and all the data that is * associated with it. * </p> * * <p> * Modified by: Joseph A. Huwaldt * </p> * * @author Joseph A. Huwaldt Date: November 11, 2000 * @version November 17, 2000 * * * @author Marc Suchard **/ @SuppressWarnings("serial") public class ContourPath implements Cloneable, java.io.Serializable { // Tolerance for path closure. private static final double kSmallX = 0.001; private static final double kSmallY = kSmallX; // X & Y coordinate arrays. private double[] xArr, yArr; // The level index for this contour path. private int levelIndex; // Indicates if this path is open or closed. private boolean closed = false; // The attributes assigned to this contour level. private ContourAttrib attributes; /** * Construct a contour path or line using the given arrays of X & Y values. * * @param attr * Attributes assigned to this contour path. * @param levelIndex * The index to then level this path belongs to. * @param x * Array of X coordinate values. * @param y * Array of Y coordinate values. **/ public ContourPath(ContourAttrib attr, int levelIndex, double[] x, double[] y) { xArr = x; yArr = y; this.levelIndex = levelIndex; attributes = attr; int np = xArr.length; // Determine if the contour path is open or closed. if (Math.abs(x[0] - x[np - 1]) < kSmallX && Math.abs(y[0] - y[np - 1]) < kSmallY) { closed = true; x[np - 1] = x[0]; y[np - 1] = y[0]; // Guarantee closure. } else closed = false; // Contour not closed. } /** * Return the X coordinate values for this contour path. **/ public double[] getAllX() { return xArr; } /** * Return the Y coordinate values for this contour path. **/ public double[] getAllY() { return yArr; } /** * Return the level index for this contour path. The level index is an index * to the level that this path belongs to: the i'th level. **/ public int getLevelIndex() { return levelIndex; } /** * Return the attributes assigned to this contour path. **/ public ContourAttrib getAttributes() { return attributes; } /** * Returns true if this contour path is closed (loops back on itself) or * false if it is not. **/ public boolean isClosed() { return closed; } /** * Make a copy of this ContourPath object. * * @return Returns a clone of this object. **/ public Object clone() { ContourPath newObject = null; try { // Make a shallow copy of this object. newObject = (ContourPath) super.clone(); // There is no "deep" data to be cloned. } catch (CloneNotSupportedException e) { // Can't happen. e.printStackTrace(); } // Output the newly cloned object. return newObject; } }