private double Generate(double x)
        {
            int X = ((int)Math.Floor(x)) & 0xff;

            x -= Math.Floor(x);
            double u = PerlinUtil.Fade(x);

            return(PerlinUtil.Lerp(u, PerlinUtil.Grad(perm[X], x), PerlinUtil.Grad(perm[X + 1], x - 1)) * 2.0d);
        }
        private double Generate(double x, double y)
        {
            int X = ((int)Math.Floor(x)) & 0xff;
            int Y = ((int)Math.Floor(y)) & 0xff;

            x -= Math.Floor(x);
            y -= Math.Floor(y);
            double u = PerlinUtil.Fade(x);
            double v = PerlinUtil.Fade(y);
            int    A = (perm[X] + Y) & 0xff;
            int    B = (perm[X + 1] + Y) & 0xff;

            return(PerlinUtil.Lerp(v,
                                   PerlinUtil.Lerp(u, PerlinUtil.Grad(perm[A], x, y), PerlinUtil.Grad(perm[B], x - 1.0d, y)),
                                   PerlinUtil.Lerp(u, PerlinUtil.Grad(perm[A + 1], x, y - 1.0d), PerlinUtil.Grad(perm[B + 1], x - 1.0d, y - 1.0d))
                                   ));
        }