package org.bukkit.util.noise; /** * Creates noise using unbiased octaves */ public abstract class OctaveGenerator { protected final NoiseGenerator[] octaves; protected double xScale = 1; protected double yScale = 1; protected double zScale = 1; protected OctaveGenerator(NoiseGenerator[] octaves) { this.octaves = octaves; } /** * Sets the scale used for all coordinates passed to this generator. *
* This is the equivalent to setting each coordinate to the specified value. * * @param scale New value to scale each coordinate by */ public void setScale(double scale) { setXScale(scale); setYScale(scale); setZScale(scale); } /** * Gets the scale used for each X-coordinates passed * * @return X scale */ public double getXScale() { return xScale; } /** * Sets the scale used for each X-coordinates passed * * @param scale New X scale */ public void setXScale(double scale) { xScale = scale; } /** * Gets the scale used for each Y-coordinates passed * * @return Y scale */ public double getYScale() { return yScale; } /** * Sets the scale used for each Y-coordinates passed * * @param scale New Y scale */ public void setYScale(double scale) { yScale = scale; } /** * Gets the scale used for each Z-coordinates passed * * @return Z scale */ public double getZScale() { return zScale; } /** * Sets the scale used for each Z-coordinates passed * * @param scale New Z scale */ public void setZScale(double scale) { zScale = scale; } /** * Gets a clone of the individual octaves used within this generator * * @return Clone of the individual octaves */ public NoiseGenerator[] getOctaves() { return octaves.clone(); } /** * Generates noise for the 1D coordinates using the specified number of octaves and parameters * * @param x X-coordinate * @param frequency How much to alter the frequency by each octave * @param amplitude How much to alter the amplitude by each octave * @return Resulting noise */ public double noise(double x, double frequency, double amplitude) { return noise(x, 0, 0, frequency, amplitude); } /** * Generates noise for the 1D coordinates using the specified number of octaves and parameters * * @param x X-coordinate * @param frequency How much to alter the frequency by each octave * @param amplitude How much to alter the amplitude by each octave * @param normalized If true, normalize the value to [-1, 1] * @return Resulting noise */ public double noise(double x, double frequency, double amplitude, boolean normalized) { return noise(x, 0, 0, frequency, amplitude, normalized); } /** * Generates noise for the 2D coordinates using the specified number of octaves and parameters * * @param x X-coordinate * @param y Y-coordinate * @param frequency How much to alter the frequency by each octave * @param amplitude How much to alter the amplitude by each octave * @return Resulting noise */ public double noise(double x, double y, double frequency, double amplitude) { return noise(x, y, 0, frequency, amplitude); } /** * Generates noise for the 2D coordinates using the specified number of octaves and parameters * * @param x X-coordinate * @param y Y-coordinate * @param frequency How much to alter the frequency by each octave * @param amplitude How much to alter the amplitude by each octave * @param normalized If true, normalize the value to [-1, 1] * @return Resulting noise */ public double noise(double x, double y, double frequency, double amplitude, boolean normalized) { return noise(x, y, 0, frequency, amplitude, normalized); } /** * Generates noise for the 3D coordinates using the specified number of octaves and parameters * * @param x X-coordinate * @param y Y-coordinate * @param z Z-coordinate * @param frequency How much to alter the frequency by each octave * @param amplitude How much to alter the amplitude by each octave * @return Resulting noise */ public double noise(double x, double y, double z, double frequency, double amplitude) { return noise(x, y, z, frequency, amplitude, false); } /** * Generates noise for the 3D coordinates using the specified number of octaves and parameters * * @param x X-coordinate * @param y Y-coordinate * @param z Z-coordinate * @param frequency How much to alter the frequency by each octave * @param amplitude How much to alter the amplitude by each octave * @param normalized If true, normalize the value to [-1, 1] * @return Resulting noise */ public double noise(double x, double y, double z, double frequency, double amplitude, boolean normalized) { double result = 0; double amp = 1; double freq = 1; double max = 0; x *= xScale; y *= yScale; z *= zScale; for (int i = 0; i < octaves.length; i++) { result += octaves[i].noise(x * freq, y * freq, z * freq) * amp; max += amp; freq *= frequency; amp *= amplitude; } if (normalized) { result /= max; } return result; } }