@Override
	public double noise(double xin, double yin) {
		double skew = (xin + yin) * F2;
		int i = (int) Math.floor(xin + skew);
		int j = (int) Math.floor(yin + skew);
		double t = (i + j) * G2;
		int ii = i & 255;
		int jj = j & 255;

		double x0 = xin - (i - t);
		double y0 = yin - (j - t);
		double t0 = 0.5 - x0 * x0 - y0 * y0;
		int gi0 = mTableMod12[ii + mTable[jj]];
		double n0 = t0 < 0 ? 0.0 : t0 * t0 * t0 * t0 * (X[gi0] * x0 + Y[gi0] * y0);

		int i1;
		int j1;
		if (x0 > y0) {
			i1 = 1;
			j1 = 0;
		} else {
			i1 = 0;
			j1 = 1;
		}
		double x1 = x0 - i1 + G2;
		double y1 = y0 - j1 + G2;
		double t1 = 0.5 - x1 * x1 - y1 * y1;
		int gi1 = mTableMod12[ii + i1 + mTable[jj + j1]];
		double n1 = t1 < 0 ? 0.0 : t1 * t1 * t1 * t1 * (X[gi1] * x1 + Y[gi1] * y1);

		double x2 = x0 - 1.0 + 2.0 * G2;
		double y2 = y0 - 1.0 + 2.0 * G2;
		double t2 = 0.5 - x2 * x2 - y2 * y2;
		int gi2 = mTableMod12[ii + 1 + mTable[jj + 1]];
		double n2 = t2 < 0 ? 0.0 : t2 * t2 * t2 * t2 * (X[gi2] * x2 + Y[gi2] * y2);

		return 70.0 * (n0 + n1 + n2);
	}