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