Toshihiro Shimizu 890ddd
/*--------------------------------------------------------------------
Toshihiro Shimizu 890ddd
 Simplex Noise C++ implementation
Toshihiro Shimizu 890ddd
 Based on a public domain code by Stefan Gustavson.
Toshihiro Shimizu 890ddd
 (The original header is below)
Toshihiro Shimizu 890ddd
--------------------------------------------------------------------*/
Toshihiro Shimizu 890ddd
/*-- start of the original header --*/
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
* A speed-improved simplex noise algorithm for 2D, 3D and 4D in Java.
Toshihiro Shimizu 890ddd
*
Toshihiro Shimizu 890ddd
* Based on example code by Stefan Gustavson (stegu@itn.liu.se).
Toshihiro Shimizu 890ddd
* Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).
Toshihiro Shimizu 890ddd
* Better rank ordering method by Stefan Gustavson in 2012.
Toshihiro Shimizu 890ddd
*
Toshihiro Shimizu 890ddd
* This could be speeded up even further, but it's useful as it is.
Toshihiro Shimizu 890ddd
*
Toshihiro Shimizu 890ddd
* Version 2012-03-09
Toshihiro Shimizu 890ddd
*
Toshihiro Shimizu 890ddd
* This code was placed in the public domain by its original author,
Toshihiro Shimizu 890ddd
* Stefan Gustavson. You may use it as you see fit, but
Toshihiro Shimizu 890ddd
* attribution is appreciated.
Toshihiro Shimizu 890ddd
*
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
/*-- end of the original header --*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "iwa_simplexnoise.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#include <math.h>  //sqrt</math.h>
Toshihiro Shimizu 890ddd
#include <iostream></iostream>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
static Grad grad3[] = {Grad(1, 1, 0),   Grad(-1, 1, 0),  Grad(1, -1, 0),
Shinya Kitaoka 120a6e
                       Grad(-1, -1, 0), Grad(1, 0, 1),   Grad(-1, 0, 1),
Shinya Kitaoka 120a6e
                       Grad(1, 0, -1),  Grad(-1, 0, -1), Grad(0, 1, 1),
Shinya Kitaoka 120a6e
                       Grad(0, -1, 1),  Grad(0, 1, -1),  Grad(0, -1, -1)};
Shinya Kitaoka 120a6e
static Grad grad4[] = {
Shinya Kitaoka 120a6e
    Grad(0, 1, 1, 1),    Grad(0, 1, 1, -1),   Grad(0, 1, -1, 1),
Shinya Kitaoka 120a6e
    Grad(0, 1, -1, -1),  Grad(0, -1, 1, 1),   Grad(0, -1, 1, -1),
Shinya Kitaoka 120a6e
    Grad(0, -1, -1, 1),  Grad(0, -1, -1, -1), Grad(1, 0, 1, 1),
Shinya Kitaoka 120a6e
    Grad(1, 0, 1, -1),   Grad(1, 0, -1, 1),   Grad(1, 0, -1, -1),
Shinya Kitaoka 120a6e
    Grad(-1, 0, 1, 1),   Grad(-1, 0, 1, -1),  Grad(-1, 0, -1, 1),
Shinya Kitaoka 120a6e
    Grad(-1, 0, -1, -1), Grad(1, 1, 0, 1),    Grad(1, 1, 0, -1),
Shinya Kitaoka 120a6e
    Grad(1, -1, 0, 1),   Grad(1, -1, 0, -1),  Grad(-1, 1, 0, 1),
Shinya Kitaoka 120a6e
    Grad(-1, 1, 0, -1),  Grad(-1, -1, 0, 1),  Grad(-1, -1, 0, -1),
Shinya Kitaoka 120a6e
    Grad(1, 1, 1, 0),    Grad(1, 1, -1, 0),   Grad(1, -1, 1, 0),
Shinya Kitaoka 120a6e
    Grad(1, -1, -1, 0),  Grad(-1, 1, 1, 0),   Grad(-1, 1, -1, 0),
Shinya Kitaoka 120a6e
    Grad(-1, -1, 1, 0),  Grad(-1, -1, -1, 0)};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// To remove the need for index wrapping, double the permutation table length
Shinya Kitaoka 120a6e
static short perm[512] = {
Shinya Kitaoka 120a6e
    151, 160, 137, 91,  90,  15,  131, 13,  201, 95,  96,  53,  194, 233, 7,
Shinya Kitaoka 120a6e
    225, 140, 36,  103, 30,  69,  142, 8,   99,  37,  240, 21,  10,  23,  190,
Shinya Kitaoka 120a6e
    6,   148, 247, 120, 234, 75,  0,   26,  197, 62,  94,  252, 219, 203, 117,
Shinya Kitaoka 120a6e
    35,  11,  32,  57,  177, 33,  88,  237, 149, 56,  87,  174, 20,  125, 136,
Shinya Kitaoka 120a6e
    171, 168, 68,  175, 74,  165, 71,  134, 139, 48,  27,  166, 77,  146, 158,
Shinya Kitaoka 120a6e
    231, 83,  111, 229, 122, 60,  211, 133, 230, 220, 105, 92,  41,  55,  46,
Shinya Kitaoka 120a6e
    245, 40,  244, 102, 143, 54,  65,  25,  63,  161, 1,   216, 80,  73,  209,
Shinya Kitaoka 120a6e
    76,  132, 187, 208, 89,  18,  169, 200, 196, 135, 130, 116, 188, 159, 86,
Shinya Kitaoka 120a6e
    164, 100, 109, 198, 173, 186, 3,   64,  52,  217, 226, 250, 124, 123, 5,
Shinya Kitaoka 120a6e
    202, 38,  147, 118, 126, 255, 82,  85,  212, 207, 206, 59,  227, 47,  16,
Shinya Kitaoka 120a6e
    58,  17,  182, 189, 28,  42,  223, 183, 170, 213, 119, 248, 152, 2,   44,
Shinya Kitaoka 120a6e
    154, 163, 70,  221, 153, 101, 155, 167, 43,  172, 9,   129, 22,  39,  253,
Shinya Kitaoka 120a6e
    19,  98,  108, 110, 79,  113, 224, 232, 178, 185, 112, 104, 218, 246, 97,
Shinya Kitaoka 120a6e
    228, 251, 34,  242, 193, 238, 210, 144, 12,  191, 179, 162, 241, 81,  51,
Shinya Kitaoka 120a6e
    145, 235, 249, 14,  239, 107, 49,  192, 214, 31,  181, 199, 106, 157, 184,
Shinya Kitaoka 120a6e
    84,  204, 176, 115, 121, 50,  45,  127, 4,   150, 254, 138, 236, 205, 93,
Shinya Kitaoka 120a6e
    222, 114, 67,  29,  24,  72,  243, 141, 128, 195, 78,  66,  215, 61,  156,
Shinya Kitaoka 120a6e
    180,
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    151, 160, 137, 91,  90,  15,  131, 13,  201, 95,  96,  53,  194, 233, 7,
Shinya Kitaoka 120a6e
    225, 140, 36,  103, 30,  69,  142, 8,   99,  37,  240, 21,  10,  23,  190,
Shinya Kitaoka 120a6e
    6,   148, 247, 120, 234, 75,  0,   26,  197, 62,  94,  252, 219, 203, 117,
Shinya Kitaoka 120a6e
    35,  11,  32,  57,  177, 33,  88,  237, 149, 56,  87,  174, 20,  125, 136,
Shinya Kitaoka 120a6e
    171, 168, 68,  175, 74,  165, 71,  134, 139, 48,  27,  166, 77,  146, 158,
Shinya Kitaoka 120a6e
    231, 83,  111, 229, 122, 60,  211, 133, 230, 220, 105, 92,  41,  55,  46,
Shinya Kitaoka 120a6e
    245, 40,  244, 102, 143, 54,  65,  25,  63,  161, 1,   216, 80,  73,  209,
Shinya Kitaoka 120a6e
    76,  132, 187, 208, 89,  18,  169, 200, 196, 135, 130, 116, 188, 159, 86,
Shinya Kitaoka 120a6e
    164, 100, 109, 198, 173, 186, 3,   64,  52,  217, 226, 250, 124, 123, 5,
Shinya Kitaoka 120a6e
    202, 38,  147, 118, 126, 255, 82,  85,  212, 207, 206, 59,  227, 47,  16,
Shinya Kitaoka 120a6e
    58,  17,  182, 189, 28,  42,  223, 183, 170, 213, 119, 248, 152, 2,   44,
Shinya Kitaoka 120a6e
    154, 163, 70,  221, 153, 101, 155, 167, 43,  172, 9,   129, 22,  39,  253,
Shinya Kitaoka 120a6e
    19,  98,  108, 110, 79,  113, 224, 232, 178, 185, 112, 104, 218, 246, 97,
Shinya Kitaoka 120a6e
    228, 251, 34,  242, 193, 238, 210, 144, 12,  191, 179, 162, 241, 81,  51,
Shinya Kitaoka 120a6e
    145, 235, 249, 14,  239, 107, 49,  192, 214, 31,  181, 199, 106, 157, 184,
Shinya Kitaoka 120a6e
    84,  204, 176, 115, 121, 50,  45,  127, 4,   150, 254, 138, 236, 205, 93,
Shinya Kitaoka 120a6e
    222, 114, 67,  29,  24,  72,  243, 141, 128, 195, 78,  66,  215, 61,  156,
Shinya Kitaoka 120a6e
    180};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
static short permMod12[512] = {
Shinya Kitaoka 120a6e
    7,  4,  5,  7, 6, 3,  11, 1,  9,  11, 0,  5, 2, 5,  7,  9,  8,  0,  7,
Shinya Kitaoka 120a6e
    6,  9,  10, 8, 3, 1,  0,  9,  10, 11, 10, 6, 4, 7,  0,  6,  3,  0,  2,
Shinya Kitaoka 120a6e
    5,  2,  10, 0, 3, 11, 9,  11, 11, 8,  9,  9, 9, 4,  9,  5,  8,  3,  6,
Shinya Kitaoka 120a6e
    8,  5,  4,  3, 0, 8,  7,  2,  9,  11, 2,  7, 0, 3,  10, 5,  2,  2,  3,
Shinya Kitaoka 120a6e
    11, 3,  1,  2, 0, 7,  1,  2,  4,  9,  8,  5, 7, 10, 5,  4,  4,  6,  11,
Shinya Kitaoka 120a6e
    6,  5,  1,  3, 5, 1,  0,  8,  1,  5,  4,  0, 7, 4,  5,  6,  1,  8,  4,
Shinya Kitaoka 120a6e
    3,  10, 8,  8, 3, 2,  8,  4,  1,  6,  5,  6, 3, 4,  4,  1,  10, 10, 4,
Shinya Kitaoka 120a6e
    3,  5,  10, 2, 3, 10, 6,  3,  10, 1,  8,  3, 2, 11, 11, 11, 4,  10, 5,
Shinya Kitaoka 120a6e
    2,  9,  4,  6, 7, 3,  2,  9,  11, 8,  8,  2, 8, 10, 7,  10, 5,  9,  5,
Shinya Kitaoka 120a6e
    11, 11, 7,  4, 9, 9,  10, 3,  1,  7,  2,  0, 2, 7,  5,  8,  4,  10, 5,
Shinya Kitaoka 120a6e
    4,  8,  2,  6, 1, 0,  11, 10, 2,  1,  10, 6, 0, 0,  11, 11, 6,  1,  9,
Shinya Kitaoka 120a6e
    3,  1,  7,  9, 2, 11, 11, 1,  0,  10, 7,  1, 7, 10, 1,  4,  0,  0,  8,
Shinya Kitaoka 120a6e
    7,  1,  2,  9, 7, 4,  6,  2,  6,  8,  1,  9, 6, 6,  7,  5,  0,  0,  3,
Shinya Kitaoka 120a6e
    9,  8,  3,  6, 6, 11, 1,  0,  0,
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    7,  4,  5,  7, 6, 3,  11, 1,  9,  11, 0,  5, 2, 5,  7,  9,  8,  0,  7,
Shinya Kitaoka 120a6e
    6,  9,  10, 8, 3, 1,  0,  9,  10, 11, 10, 6, 4, 7,  0,  6,  3,  0,  2,
Shinya Kitaoka 120a6e
    5,  2,  10, 0, 3, 11, 9,  11, 11, 8,  9,  9, 9, 4,  9,  5,  8,  3,  6,
Shinya Kitaoka 120a6e
    8,  5,  4,  3, 0, 8,  7,  2,  9,  11, 2,  7, 0, 3,  10, 5,  2,  2,  3,
Shinya Kitaoka 120a6e
    11, 3,  1,  2, 0, 7,  1,  2,  4,  9,  8,  5, 7, 10, 5,  4,  4,  6,  11,
Shinya Kitaoka 120a6e
    6,  5,  1,  3, 5, 1,  0,  8,  1,  5,  4,  0, 7, 4,  5,  6,  1,  8,  4,
Shinya Kitaoka 120a6e
    3,  10, 8,  8, 3, 2,  8,  4,  1,  6,  5,  6, 3, 4,  4,  1,  10, 10, 4,
Shinya Kitaoka 120a6e
    3,  5,  10, 2, 3, 10, 6,  3,  10, 1,  8,  3, 2, 11, 11, 11, 4,  10, 5,
Shinya Kitaoka 120a6e
    2,  9,  4,  6, 7, 3,  2,  9,  11, 8,  8,  2, 8, 10, 7,  10, 5,  9,  5,
Shinya Kitaoka 120a6e
    11, 11, 7,  4, 9, 9,  10, 3,  1,  7,  2,  0, 2, 7,  5,  8,  4,  10, 5,
Shinya Kitaoka 120a6e
    4,  8,  2,  6, 1, 0,  11, 10, 2,  1,  10, 6, 0, 0,  11, 11, 6,  1,  9,
Shinya Kitaoka 120a6e
    3,  1,  7,  9, 2, 11, 11, 1,  0,  10, 7,  1, 7, 10, 1,  4,  0,  0,  8,
Shinya Kitaoka 120a6e
    7,  1,  2,  9, 7, 4,  6,  2,  6,  8,  1,  9, 6, 6,  7,  5,  0,  0,  3,
Shinya Kitaoka 120a6e
    9,  8,  3,  6, 6, 11, 1,  0,  0};
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------
Toshihiro Shimizu 890ddd
// 2D simplex noise
Toshihiro Shimizu 890ddd
//----------------------------------------
Shinya Kitaoka 120a6e
double SimplexNoise::noise(double xin, double yin) {
Shinya Kitaoka 120a6e
  // Skewing and unskewing factors for 2 dimensions
Shinya Kitaoka 120a6e
  static const double F2 = 0.5 * (sqrt(3.0) - 1.0);
Shinya Kitaoka 120a6e
  static const double G2 = (3.0 - sqrt(3.0)) / 6.0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  double n0, n1, n2;  // Noise contributions from the three corners
Shinya Kitaoka 120a6e
  // Skew the input space to determine which simplex cell we're in
Shinya Kitaoka 120a6e
  double s  = (xin + yin) * F2;  // Hairy factor for 2D
Shinya Kitaoka 120a6e
  int i     = fastfloor(xin + s);
Shinya Kitaoka 120a6e
  int j     = fastfloor(yin + s);
Shinya Kitaoka 120a6e
  double t  = (i + j) * G2;
Shinya Kitaoka 120a6e
  double X0 = i - t;  // Unskew the cell origin back to (x,y) space
Shinya Kitaoka 120a6e
  double Y0 = j - t;
Shinya Kitaoka 120a6e
  double x0 = xin - X0;  // The x,y distances from the cell origin
Shinya Kitaoka 120a6e
  double y0 = yin - Y0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // For the 2D case, the simplex shape is an equilateral triangle.
Shinya Kitaoka 120a6e
  // Determine which simplex we are in.
Shinya Kitaoka 120a6e
  int i1, j1;  // Offsets for second (middle) corner of simplex in (i,j) coords
Shinya Kitaoka 120a6e
  if (x0 > y0) {
Shinya Kitaoka 120a6e
    i1 = 1;
Shinya Kitaoka 120a6e
    j1 = 0;
Shinya Kitaoka 120a6e
  }  // lower triangle, XY order: (0,0)->(1,0)->(1,1)
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    i1 = 0;
Shinya Kitaoka 120a6e
    j1 = 1;
Shinya Kitaoka 120a6e
  }  // upper triangle, YX order: (0,0)->(0,1)->(1,1)
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
Shinya Kitaoka 120a6e
  // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
Shinya Kitaoka 120a6e
  // c = (3-sqrt(3))/6
Shinya Kitaoka 120a6e
  double x1 =
Shinya Kitaoka 120a6e
      x0 - i1 + G2;  // Offsets for middle corner in (x,y) unskewed coords
Shinya Kitaoka 120a6e
  double y1 = y0 - j1 + G2;
Shinya Kitaoka 120a6e
  double x2 =
Shinya Kitaoka 120a6e
      x0 - 1.0 + 2.0 * G2;  // Offsets for last corner in (x,y) unskewed coords
Shinya Kitaoka 120a6e
  double y2 = y0 - 1.0 + 2.0 * G2;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Work out the hashed gradient indices of the three simplex corners
Shinya Kitaoka 120a6e
  int ii  = i & 255;
Shinya Kitaoka 120a6e
  int jj  = j & 255;
Shinya Kitaoka 120a6e
  int gi0 = permMod12[ii + perm[jj]];
Shinya Kitaoka 120a6e
  int gi1 = permMod12[ii + i1 + perm[jj + j1]];
Shinya Kitaoka 120a6e
  int gi2 = permMod12[ii + 1 + perm[jj + 1]];
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Calculate the contribution from the three corners
Shinya Kitaoka 120a6e
  double t0 = 0.5 - x0 * x0 - y0 * y0;
Shinya Kitaoka 120a6e
  if (t0 < 0)
Shinya Kitaoka 120a6e
    n0 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t0 *= t0;
Shinya Kitaoka 120a6e
    n0 = t0 * t0 *
Shinya Kitaoka 120a6e
         dot(grad3[gi0], x0, y0);  // (x,y) of grad3 used for 2D gradient
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t1 = 0.5 - x1 * x1 - y1 * y1;
Shinya Kitaoka 120a6e
  if (t1 < 0)
Shinya Kitaoka 120a6e
    n1 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t1 *= t1;
Shinya Kitaoka 120a6e
    n1 = t1 * t1 * dot(grad3[gi1], x1, y1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t2 = 0.5 - x2 * x2 - y2 * y2;
Shinya Kitaoka 120a6e
  if (t2 < 0)
Shinya Kitaoka 120a6e
    n2 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t2 *= t2;
Shinya Kitaoka 120a6e
    n2 = t2 * t2 * dot(grad3[gi2], x2, y2);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Add contributions from each corner to get the final noise value.
Shinya Kitaoka 120a6e
  // The result is scaled to return values in the interval [-1,1].
Shinya Kitaoka 120a6e
  return 70.0 * (n0 + n1 + n2);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------
Toshihiro Shimizu 890ddd
// 3D simplex noise
Toshihiro Shimizu 890ddd
//----------------------------------------
Shinya Kitaoka 120a6e
double SimplexNoise::noise(double xin, double yin, double zin) {
Shinya Kitaoka 120a6e
  // Skewing and unskewing factors for 3 dimensions
Shinya Kitaoka 120a6e
  static const double F3 = 1.0 / 3.0;
Shinya Kitaoka 120a6e
  static const double G3 = 1.0 / 6.0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  double n0, n1, n2, n3;  // Noise contributions from the four corners
Shinya Kitaoka 120a6e
  // Skew the input space to determine which simplex cell we're in
Shinya Kitaoka 120a6e
  double s = (xin + yin + zin) * F3;  // Very nice and simple skew factor for 3D
Shinya Kitaoka 120a6e
  int i    = fastfloor(xin + s);
Shinya Kitaoka 120a6e
  int j    = fastfloor(yin + s);
Shinya Kitaoka 120a6e
  int k    = fastfloor(zin + s);
Shinya Kitaoka 120a6e
  double t = (i + j + k) * G3;
Shinya Kitaoka 120a6e
  double X0 = i - t;  // Unskew the cell origin back to (x,y,z) space
Shinya Kitaoka 120a6e
  double Y0 = j - t;
Shinya Kitaoka 120a6e
  double Z0 = k - t;
Shinya Kitaoka 120a6e
  double x0 = xin - X0;  // The x,y,z distances from the cell origin
Shinya Kitaoka 120a6e
  double y0 = yin - Y0;
Shinya Kitaoka 120a6e
  double z0 = zin - Z0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // For the 3D case, the simplex shape is a slightly irregular tetrahedron.
Shinya Kitaoka 120a6e
  // Determine which simplex we are in.
Shinya Kitaoka 120a6e
  int i1, j1, k1;  // Offsets for second corner of simplex in (i,j,k) coords
Shinya Kitaoka 120a6e
  int i2, j2, k2;  // Offsets for third corner of simplex in (i,j,k) coords
Shinya Kitaoka 120a6e
  if (x0 >= y0) {
Shinya Kitaoka 120a6e
    if (y0 >= z0) {
Shinya Kitaoka 120a6e
      i1 = 1;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 0;
Shinya Kitaoka 120a6e
    }  // X Y Z order
Shinya Kitaoka 120a6e
    else if (x0 >= z0) {
Shinya Kitaoka 120a6e
      i1 = 1;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 0;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }  // X Z Y order
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 1;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 0;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }       // Z X Y order
Shinya Kitaoka 120a6e
  } else {  // x0
Shinya Kitaoka 120a6e
    if (y0 < z0) {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 1;
Shinya Kitaoka 120a6e
      i2 = 0;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }  // Z Y X order
Shinya Kitaoka 120a6e
    else if (x0 < z0) {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 1;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 0;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }  // Y Z X order
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 1;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 0;
Shinya Kitaoka 120a6e
    }  // Y X Z order
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),
Shinya Kitaoka 120a6e
  // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
Shinya Kitaoka 120a6e
  // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
Shinya Kitaoka 120a6e
  // c = 1/6.
Shinya Kitaoka 120a6e
  double x1 = x0 - i1 + G3;  // Offsets for second corner in (x,y,z) coords
Shinya Kitaoka 120a6e
  double y1 = y0 - j1 + G3;
Shinya Kitaoka 120a6e
  double z1 = z0 - k1 + G3;
Shinya Kitaoka 120a6e
  double x2 = x0 - i2 + 2.0 * G3;  // Offsets for third corner in (x,y,z) coords
Shinya Kitaoka 120a6e
  double y2 = y0 - j2 + 2.0 * G3;
Shinya Kitaoka 120a6e
  double z2 = z0 - k2 + 2.0 * G3;
Shinya Kitaoka 120a6e
  double x3 = x0 - 1.0 + 3.0 * G3;  // Offsets for last corner in (x,y,z) coords
Shinya Kitaoka 120a6e
  double y3 = y0 - 1.0 + 3.0 * G3;
Shinya Kitaoka 120a6e
  double z3 = z0 - 1.0 + 3.0 * G3;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Work out the hashed gradient indices of the four simplex corners
Shinya Kitaoka 120a6e
  int ii  = i & 255;
Shinya Kitaoka 120a6e
  int jj  = j & 255;
Shinya Kitaoka 120a6e
  int kk  = k & 255;
Shinya Kitaoka 120a6e
  int gi0 = permMod12[ii + perm[jj + perm[kk]]];
Shinya Kitaoka 120a6e
  int gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]];
Shinya Kitaoka 120a6e
  int gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]];
Shinya Kitaoka 120a6e
  int gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]];
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Calculate the contribution from the four corners
Shinya Kitaoka 120a6e
  double range = 0.6;
Shinya Kitaoka 120a6e
  double t0    = range - x0 * x0 - y0 * y0 - z0 * z0;
Shinya Kitaoka 120a6e
  if (t0 < 0)
Shinya Kitaoka 120a6e
    n0 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t0 *= t0;
Shinya Kitaoka 120a6e
    n0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t1 = range - x1 * x1 - y1 * y1 - z1 * z1;
Shinya Kitaoka 120a6e
  if (t1 < 0)
Shinya Kitaoka 120a6e
    n1 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t1 *= t1;
Shinya Kitaoka 120a6e
    n1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t2 = range - x2 * x2 - y2 * y2 - z2 * z2;
Shinya Kitaoka 120a6e
  if (t2 < 0)
Shinya Kitaoka 120a6e
    n2 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t2 *= t2;
Shinya Kitaoka 120a6e
    n2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t3 = range - x3 * x3 - y3 * y3 - z3 * z3;
Shinya Kitaoka 120a6e
  if (t3 < 0)
Shinya Kitaoka 120a6e
    n3 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t3 *= t3;
Shinya Kitaoka 120a6e
    n3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // Add contributions from each corner to get the final noise value.
Shinya Kitaoka 120a6e
  // The result is scaled to stay just inside [-1,1]
Shinya Kitaoka 120a6e
  /*- 変更: [-0.5,0.5] の範囲にする -*/
Shinya Kitaoka 120a6e
  return 16.0 * (n0 + n1 + n2 + n3);
Shinya Kitaoka 120a6e
  // return 32.0*(n0 + n1 + n2 + n3);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------
Toshihiro Shimizu 890ddd
// 4D simplex noise
Toshihiro Shimizu 890ddd
//----------------------------------------
Shinya Kitaoka 120a6e
double SimplexNoise::noise(double x, double y, double z, double w) {
Shinya Kitaoka 120a6e
  // Skewing and unskewing factors for 4 dimensions
Shinya Kitaoka 120a6e
  static const double F4 = (sqrt(5.0) - 1.0) / 4.0;
Shinya Kitaoka 120a6e
  static const double G4 = (5.0 - sqrt(5.0)) / 20.0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // The skewing and unskewing factors are hairy again for the 4D case
Shinya Kitaoka 120a6e
  double n0, n1, n2, n3, n4;  // Noise contributions from the five corners
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
Shinya Kitaoka 120a6e
  double s  = (x + y + z + w) * F4;  // Factor for 4D skewing
Shinya Kitaoka 120a6e
  int i     = fastfloor(x + s);
Shinya Kitaoka 120a6e
  int j     = fastfloor(y + s);
Shinya Kitaoka 120a6e
  int k     = fastfloor(z + s);
Shinya Kitaoka 120a6e
  int l     = fastfloor(w + s);
Shinya Kitaoka 120a6e
  double t  = (i + j + k + l) * G4;  // Factor for 4D unskewing
Shinya Kitaoka 120a6e
  double X0 = i - t;  // Unskew the cell origin back to (x,y,z,w) space
Shinya Kitaoka 120a6e
  double Y0 = j - t;
Shinya Kitaoka 120a6e
  double Z0 = k - t;
Shinya Kitaoka 120a6e
  double W0 = l - t;
Shinya Kitaoka 120a6e
  double x0 = x - X0;  // The x,y,z,w distances from the cell origin
Shinya Kitaoka 120a6e
  double y0 = y - Y0;
Shinya Kitaoka 120a6e
  double z0 = z - Z0;
Shinya Kitaoka 120a6e
  double w0 = w - W0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // For the 4D case, the simplex is a 4D shape I won't even try to describe.
Shinya Kitaoka 120a6e
  // To find out which of the 24 possible simplices we're in, we need to
Shinya Kitaoka 120a6e
  // determine the magnitude ordering of x0, y0, z0 and w0.
Shinya Kitaoka 120a6e
  // Six pair-wise comparisons are performed between each possible pair
Shinya Kitaoka 120a6e
  // of the four coordinates, and the results are used to rank the numbers.
Shinya Kitaoka 120a6e
  int rankx = 0;
Shinya Kitaoka 120a6e
  int ranky = 0;
Shinya Kitaoka 120a6e
  int rankz = 0;
Shinya Kitaoka 120a6e
  int rankw = 0;
Shinya Kitaoka 120a6e
  if (x0 > y0)
Shinya Kitaoka 120a6e
    rankx++;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    ranky++;
Shinya Kitaoka 120a6e
  if (x0 > z0)
Shinya Kitaoka 120a6e
    rankx++;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    rankz++;
Shinya Kitaoka 120a6e
  if (x0 > w0)
Shinya Kitaoka 120a6e
    rankx++;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    rankw++;
Shinya Kitaoka 120a6e
  if (y0 > z0)
Shinya Kitaoka 120a6e
    ranky++;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    rankz++;
Shinya Kitaoka 120a6e
  if (y0 > w0)
Shinya Kitaoka 120a6e
    ranky++;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    rankw++;
Shinya Kitaoka 120a6e
  if (z0 > w0)
Shinya Kitaoka 120a6e
    rankz++;
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    rankw++;
Shinya Kitaoka 120a6e
  int i1, j1, k1, l1;  // The integer offsets for the second simplex corner
Shinya Kitaoka 120a6e
  int i2, j2, k2, l2;  // The integer offsets for the third simplex corner
Shinya Kitaoka 120a6e
  int i3, j3, k3, l3;  // The integer offsets for the fourth simplex corner
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.
Shinya Kitaoka 120a6e
  // Many values of c will never occur, since e.g. x>y>z>w makes x
Shinya Kitaoka 120a6e
  // x
Shinya Kitaoka 120a6e
  // impossible. Only the 24 indices which have non-zero entries make any sense.
Shinya Kitaoka 120a6e
  // We use a thresholding to set the coordinates in turn from the largest
Shinya Kitaoka 120a6e
  // magnitude.
Shinya Kitaoka 120a6e
  // Rank 3 denotes the largest coordinate.
Shinya Kitaoka 120a6e
  i1 = rankx >= 3 ? 1 : 0;
Shinya Kitaoka 120a6e
  j1 = ranky >= 3 ? 1 : 0;
Shinya Kitaoka 120a6e
  k1 = rankz >= 3 ? 1 : 0;
Shinya Kitaoka 120a6e
  l1 = rankw >= 3 ? 1 : 0;
Shinya Kitaoka 120a6e
  // Rank 2 denotes the second largest coordinate.
Shinya Kitaoka 120a6e
  i2 = rankx >= 2 ? 1 : 0;
Shinya Kitaoka 120a6e
  j2 = ranky >= 2 ? 1 : 0;
Shinya Kitaoka 120a6e
  k2 = rankz >= 2 ? 1 : 0;
Shinya Kitaoka 120a6e
  l2 = rankw >= 2 ? 1 : 0;
Shinya Kitaoka 120a6e
  // Rank 1 denotes the second smallest coordinate.
Shinya Kitaoka 120a6e
  i3 = rankx >= 1 ? 1 : 0;
Shinya Kitaoka 120a6e
  j3 = ranky >= 1 ? 1 : 0;
Shinya Kitaoka 120a6e
  k3 = rankz >= 1 ? 1 : 0;
Shinya Kitaoka 120a6e
  l3 = rankw >= 1 ? 1 : 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // The fifth corner has all coordinate offsets = 1, so no need to look that
Shinya Kitaoka 120a6e
  // up.
Shinya Kitaoka 120a6e
  double x1 = x0 - i1 + G4;  // Offsets for second corner in (x,y,z,w) coords
Shinya Kitaoka 120a6e
  double y1 = y0 - j1 + G4;
Shinya Kitaoka 120a6e
  double z1 = z0 - k1 + G4;
Shinya Kitaoka 120a6e
  double w1 = w0 - l1 + G4;
Shinya Kitaoka 120a6e
  double x2 =
Shinya Kitaoka 120a6e
      x0 - i2 + 2.0 * G4;  // Offsets for third corner in (x,y,z,w) coords
Shinya Kitaoka 120a6e
  double y2 = y0 - j2 + 2.0 * G4;
Shinya Kitaoka 120a6e
  double z2 = z0 - k2 + 2.0 * G4;
Shinya Kitaoka 120a6e
  double w2 = w0 - l2 + 2.0 * G4;
Shinya Kitaoka 120a6e
  double x3 =
Shinya Kitaoka 120a6e
      x0 - i3 + 3.0 * G4;  // Offsets for fourth corner in (x,y,z,w) coords
Shinya Kitaoka 120a6e
  double y3 = y0 - j3 + 3.0 * G4;
Shinya Kitaoka 120a6e
  double z3 = z0 - k3 + 3.0 * G4;
Shinya Kitaoka 120a6e
  double w3 = w0 - l3 + 3.0 * G4;
Shinya Kitaoka 120a6e
  double x4 =
Shinya Kitaoka 120a6e
      x0 - 1.0 + 4.0 * G4;  // Offsets for last corner in (x,y,z,w) coords
Shinya Kitaoka 120a6e
  double y4 = y0 - 1.0 + 4.0 * G4;
Shinya Kitaoka 120a6e
  double z4 = z0 - 1.0 + 4.0 * G4;
Shinya Kitaoka 120a6e
  double w4 = w0 - 1.0 + 4.0 * G4;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Work out the hashed gradient indices of the five simplex corners
Shinya Kitaoka 120a6e
  int ii  = i & 255;
Shinya Kitaoka 120a6e
  int jj  = j & 255;
Shinya Kitaoka 120a6e
  int kk  = k & 255;
Shinya Kitaoka 120a6e
  int ll  = l & 255;
Shinya Kitaoka 120a6e
  int gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32;
Shinya Kitaoka 120a6e
  int gi1 = perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32;
Shinya Kitaoka 120a6e
  int gi2 = perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32;
Shinya Kitaoka 120a6e
  int gi3 = perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32;
Shinya Kitaoka 120a6e
  int gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*- パラメータ調整 -*/
Shinya Kitaoka 120a6e
  double range = 0.66;
Shinya Kitaoka 120a6e
  // double range = 0.6;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Calculate the contribution from the five corners
Shinya Kitaoka 120a6e
  double t0 = range - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
Shinya Kitaoka 120a6e
  if (t0 < 0)
Shinya Kitaoka 120a6e
    n0 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t0 *= t0;
Shinya Kitaoka 120a6e
    n0 = t0 * t0 * dot(grad4[gi0], x0, y0, z0, w0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t1 = range - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
Shinya Kitaoka 120a6e
  if (t1 < 0)
Shinya Kitaoka 120a6e
    n1 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t1 *= t1;
Shinya Kitaoka 120a6e
    n1 = t1 * t1 * dot(grad4[gi1], x1, y1, z1, w1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t2 = range - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
Shinya Kitaoka 120a6e
  if (t2 < 0)
Shinya Kitaoka 120a6e
    n2 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t2 *= t2;
Shinya Kitaoka 120a6e
    n2 = t2 * t2 * dot(grad4[gi2], x2, y2, z2, w2);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t3 = range - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
Shinya Kitaoka 120a6e
  if (t3 < 0)
Shinya Kitaoka 120a6e
    n3 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t3 *= t3;
Shinya Kitaoka 120a6e
    n3 = t3 * t3 * dot(grad4[gi3], x3, y3, z3, w3);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  double t4 = range - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
Shinya Kitaoka 120a6e
  if (t4 < 0)
Shinya Kitaoka 120a6e
    n4 = 0.0;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    t4 *= t4;
Shinya Kitaoka 120a6e
    n4 = t4 * t4 * dot(grad4[gi4], x4, y4, z4, w4);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Sum up and scale the result to cover the range [-1,1]
Shinya Kitaoka 120a6e
  return 27.0 * (n0 + n1 + n2 + n3 + n4);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*----------------------------------------
Toshihiro Shimizu 890ddd
 セルまたぎを防ぐために、現在の所属セルを得る
Toshihiro Shimizu 890ddd
----------------------------------------*/
Shinya Kitaoka 120a6e
CellIds SimplexNoise::getCellIds(double xin, double yin, double zin) {
Shinya Kitaoka 120a6e
  // Skew the input space to determine which simplex cell we're in
Shinya Kitaoka 120a6e
  const double F3 = 1.0 / 3.0;
Shinya Kitaoka 120a6e
  double s = (xin + yin + zin) * F3;  // Very nice and simple skew factor for 3D
Shinya Kitaoka 120a6e
  int i    = fastfloor(xin + s);
Shinya Kitaoka 120a6e
  int j    = fastfloor(yin + s);
Shinya Kitaoka 120a6e
  int k    = fastfloor(zin + s);
Shinya Kitaoka 120a6e
  const double G3 = 1.0 / 6.0;  // Very nice and simple unskew factor, too
Shinya Kitaoka 120a6e
  double t        = (i + j + k) * G3;
Shinya Kitaoka 120a6e
  double X0       = i - t;  // Unskew the cell origin back to (x,y,z) space
Shinya Kitaoka 120a6e
  double Y0       = j - t;
Shinya Kitaoka 120a6e
  double Z0       = k - t;
Shinya Kitaoka 120a6e
  double x0       = xin - X0;  // The x,y,z distances from the cell origin
Shinya Kitaoka 120a6e
  double y0       = yin - Y0;
Shinya Kitaoka 120a6e
  double z0       = zin - Z0;
Shinya Kitaoka 120a6e
  // For the 3D case, the simplex shape is a slightly irregular tetrahedron.
Shinya Kitaoka 120a6e
  // Determine which simplex we are in.
Shinya Kitaoka 120a6e
  int i1, j1, k1;  // Offsets for second corner of simplex in (i,j,k) coords
Shinya Kitaoka 120a6e
  int i2, j2, k2;  // Offsets for third corner of simplex in (i,j,k) coords
Shinya Kitaoka 120a6e
  if (x0 >= y0) {
Shinya Kitaoka 120a6e
    if (y0 >= z0) {
Shinya Kitaoka 120a6e
      i1 = 1;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 0;
Shinya Kitaoka 120a6e
    }  // X Y Z order
Shinya Kitaoka 120a6e
    else if (x0 >= z0) {
Shinya Kitaoka 120a6e
      i1 = 1;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 0;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }  // X Z Y order
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 1;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 0;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }       // Z X Y order
Shinya Kitaoka 120a6e
  } else {  // x0
Shinya Kitaoka 120a6e
    if (y0 < z0) {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 0;
Shinya Kitaoka 120a6e
      k1 = 1;
Shinya Kitaoka 120a6e
      i2 = 0;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }  // Z Y X order
Shinya Kitaoka 120a6e
    else if (x0 < z0) {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 1;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 0;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 1;
Shinya Kitaoka 120a6e
    }  // Y Z X order
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      i1 = 0;
Shinya Kitaoka 120a6e
      j1 = 1;
Shinya Kitaoka 120a6e
      k1 = 0;
Shinya Kitaoka 120a6e
      i2 = 1;
Shinya Kitaoka 120a6e
      j2 = 1;
Shinya Kitaoka 120a6e
      k2 = 0;
Shinya Kitaoka 120a6e
    }  // Y X Z order
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return CellIds(i, j, k, i1, j1, k1, i2, j2, k2);
Toshihiro Shimizu 890ddd
}