예제 #1
0
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);
}
예제 #2
0
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();
}