float Noise3D::get(float x, float y, float z) const { Vec3f origins[8]; Vec3f grads[8]; get_gradients(origins, grads, x, y, z); float vals[] = { Gradient(origins[0], grads[0], {x, y, z}), Gradient(origins[1], grads[1], {x, y, z}), Gradient(origins[2], grads[2], {x, y, z}), Gradient(origins[3], grads[3], {x, y, z}), Gradient(origins[4], grads[4], {x, y, z}), Gradient(origins[5], grads[5], {x, y, z}), Gradient(origins[6], grads[6], {x, y, z}), Gradient(origins[7], grads[7], {x, y, z}), }; float fz = Smooth(z - origins[0].z); float vz0 = lerp(vals[0], vals[1], fz); float vz1 = lerp(vals[2], vals[3], fz); float vz2 = lerp(vals[4], vals[5], fz); float vz3 = lerp(vals[6], vals[7], fz); float fy = Smooth(y - origins[0].y); float vy0 = lerp(vz0, vz1, fy); float vy1 = lerp(vz2, vz3, fy); float fx = Smooth(x - origins[0].x); return lerp(vy0, vy1, fx); }
float Noise2D::get(float x, float y) const { Vec2f origins[4]; Vec2f grads[4]; get_gradients(origins, grads, x, y); float vals[] = { Gradient(origins[0], grads[0], {x, y}), Gradient(origins[1], grads[1], {x, y}), Gradient(origins[2], grads[2], {x, y}), Gradient(origins[3], grads[3], {x, y}), }; float fx = Smooth(x - origins[0].x); float vx0 = lerp(vals[0], vals[1], fx); float vx1 = lerp(vals[2], vals[3], fx); float fy = Smooth(y - origins[0].y); return lerp(vx0, vx1, fy); }
// Set the objective function and gradients for GSL minimizer void set_functions(const gsl_vector *x, void *params, double *f, gsl_vector *g) { *f = objective_function(x, params); get_gradients(x, params, g); }