001 package util.wavelet;
002
003 /** An enumeration of boundary conditions. When an array index exceeds
004 * the bounds of its array it must be converted back into the legal range.
005 *
006 * @author John Talbot
007 */
008 public enum BoundaryCondition {
009 Continuity() { // Continuity (hard clipping to boudary value)
010 public int test(int index, int upperBoundary) {
011 if (index < 0) return 0;
012 else {
013 if (index >= upperBoundary) return upperBoundary - 1;
014 else return index;
015 }
016 }
017 },
018 Mirror() { // mirrored relative to boundary
019 public int test(int index, int upperBoundary) {
020 // if |index| > 2*upperBoundary then switch to periodic boundary for code simplicity
021 if (index < 0) return (-index % upperBoundary);
022 else {
023 if (index >= upperBoundary) return (2 * (upperBoundary - 1) - index) % upperBoundary;
024 else return index;
025 }
026 }
027 },
028 Periodic() { // periodic relative to boundary
029 public int test(int index, int upperBoundary) {
030 if (index < 0) return (index % upperBoundary) + upperBoundary;
031 else return index % upperBoundary;
032 }
033 };
034
035 /**
036 * Test the boundary conditions. Default returns perdiodic boundary.
037 * The lower boundary is 0 by default.
038 *
039 * @param index value to test against upper boundary
040 * @param upperBoundary upper boundary
041 * @return the index value if it is within the upper boundary, periodic otherwise
042 */
043 public int test(int index, int upperBoundary) {
044 if (index < 0) return (index % upperBoundary) + upperBoundary;
045 else return index % upperBoundary;
046 }
047 }