private static double Dot(Grad g, double x, double y, double z)
 {
     return g.X * x + g.Y * y + g.Z * z;
 }
 private static double Dot(Grad g, double x, double y, double z, double w)
 {
     return g.X * x + g.Y * y + g.Z * z + g.W * w;
 }
 private static double Dot(Grad g, double x, double y)
 {
     return g.X * x + g.Y * y;
 }