noise2D method

double noise2D (double xin, double yin)

Implementation

double noise2D(double xin, double yin) {
  double n0, n1, n2; // Noise contributions from the three corners
  // Skew the input space to determine which simplex cell we're in
  final double s = (xin + yin) * _F2; // Hairy factor for 2D
  final int i = (xin + s).floor();
  final int j = (yin + s).floor();
  final double t = (i + j) * _G2;
  final double X0 = i - t; // Unskew the cell origin back to (x,y) space
  final double Y0 = j - t;
  final double x0 = xin - X0; // The x,y distances from the cell origin
  final double y0 = yin - Y0;
  // For the 2D case, the simplex shape is an equilateral triangle.
  // Determine which simplex we are in.
  int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords
  if (x0 > y0) {
    i1 = 1;
    j1 = 0;
  } // lower triangle, XY order: (0,0)->(1,0)->(1,1)
  else {
    i1 = 0;
    j1 = 1;
  } // upper triangle, YX order: (0,0)->(0,1)->(1,1)
  // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
  // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
  // c = (3-sqrt(3))/6
  final double x1 =
      x0 - i1 + _G2; // Offsets for middle corner in (x,y) unskewed coords
  final double y1 = y0 - j1 + _G2;
  final double x2 = x0 -
      1.0 +
      2.0 * _G2; // Offsets for last corner in (x,y) unskewed coords
  final double y2 = y0 - 1.0 + 2.0 * _G2;
  // Work out the hashed gradient indices of the three simplex corners
  final int ii = i & 255;
  final int jj = j & 255;
  final int gi0 = _permMod12[ii + _perm[jj]];
  final int gi1 = _permMod12[ii + i1 + _perm[jj + j1]];
  final int gi2 = _permMod12[ii + 1 + _perm[jj + 1]];
  // Calculate the contribution from the three corners
  double t0 = 0.5 - x0 * x0 - y0 * y0;
  if (t0 < 0)
    n0 = 0.0;
  else {
    t0 *= t0;
    n0 = t0 *
        t0 *
        _dot2(_grad3[gi0], x0, y0); // (x,y) of grad3 used for 2D gradient
  }
  double t1 = 0.5 - x1 * x1 - y1 * y1;
  if (t1 < 0)
    n1 = 0.0;
  else {
    t1 *= t1;
    n1 = t1 * t1 * _dot2(_grad3[gi1], x1, y1);
  }
  double t2 = 0.5 - x2 * x2 - y2 * y2;
  if (t2 < 0)
    n2 = 0.0;
  else {
    t2 *= t2;
    n2 = t2 * t2 * _dot2(_grad3[gi2], x2, y2);
  }
  // Add contributions from each corner to get the final noise value.
  // The result is scaled to return values in the interval [-1,1].
  return 70.0 * (n0 + n1 + n2);
}