Vector3 Vector3::randomInSphere(double radius, bool only_surface, RandomGenerator &random) { // TODO More uniform spatial repartition // The current randomization clusters result near the center and at the poles VectorSpherical vec = {only_surface ? radius : random.genDouble() * radius, (random.genDouble() - 0.5) * Maths::PI, random.genDouble() * Maths::TWOPI}; return Vector3(vec); }
string FractalNoise::checkDistribution() { stringstream result; double val, min, max, mean; RandomGenerator random; int samples = 10000000; double factor = 1.0 / to_double(samples); min = 0.0; max = 0.0; mean = 0.0; for (int i = 0; i < samples; i++) { val = getBase1d((random.genDouble() - 0.5) * 10.0); min = std::min(val, min); max = std::max(val, max); mean += val * factor; } result << "1d : min=" << min << " max=" << max << " mean=" << mean << endl; min = 0.0; max = 0.0; mean = 0.0; for (int i = 0; i < samples; i++) { val = getBase2d((random.genDouble() - 0.5) * 10.0, (random.genDouble() - 0.5) * 10.0); min = std::min(val, min); max = std::max(val, max); mean += val * factor; } result << "2d : min=" << min << " max=" << max << " mean=" << mean << endl; min = 0.0; max = 0.0; mean = 0.0; for (int i = 0; i < samples; i++) { val = getBase3d((random.genDouble() - 0.5) * 10.0, (random.genDouble() - 0.5) * 10.0, (random.genDouble() - 0.5) * 10.0); min = std::min(val, min); max = std::max(val, max); mean += val * factor; } result << "3d : min=" << min << " max=" << max << " mean=" << mean << endl; return result.str(); }