simplex static method

double simplex(
  1. num xin,
  2. num yin
)

Implementation

static double simplex(num xin,num yin) {
  double n0, n1, n2; // Noise contributions from the three corners
  // Skew the input space to determine which simplex cell we're in
  double s = (xin+yin)*F2; // Hairy factor for 2D
  int i = (xin+s).floor();
  int j = (yin+s).floor();
  double t = (i+j)*G2;
  double x0 = xin-i+t; // The x,y distances from the cell origin, unskewed
  double y0 = yin-j+t;
  // 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) { // Lower triangle, XY order: (0,0)->(1,0)->(1,1)
    i1 = 1; j1 = 0;
  }
  else { // Upper triangle, YX order: (0,0)->(0,1)->(1,1)
    i1 = 0; j1 = 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
  double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
  double y1 = y0 - j1 + G2;
  double x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords
  double y2 = y0 - 1 + 2 * G2;
  // Work out the hashed gradient indices of the three simplex corners
  i &= 255;
  j &= 255;
  Grad gi0 = gradP[i+perm[j]];
  Grad gi1 = gradP[i+i1+perm[j+j1]];
  Grad gi2 = gradP[i+1+perm[j+1]];
  // Calculate the contribution from the three corners
  double t0 = 0.5 - x0*x0-y0*y0;
  if (t0 < 0) {
      n0 = 0;
  }
  else {
      t0 *= t0;
      n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient
  }
  double t1 = 0.5 - x1*x1-y1*y1;
  if (t1 < 0) {
    n1 = 0;
  }
  else {
    t1 *= t1;
    n1 = t1 * t1 * gi1.dot2(x1, y1);
  }
  double t2 = 0.5 - x2*x2-y2*y2;
  if (t2 < 0) {
    n2 = 0;
  }
  else {
    t2 *= t2;
    n2 = t2 * t2 * gi2.dot2(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 * (n0 + n1 + n2);
}