uniform_distortion.h

Back to Uniform distortion

pastel/math/sampling/

// Description: Uniform distortion

#ifndef PASTELMATH_UNIFORM_DISTORTION_H
#define PASTELMATH_UNIFORM_DISTORTION_H

#include "pastel/sys/vector.h"

namespace Pastel
{

    //! Uniformly samples a point from an annulus
    /*!
   Preconditions:
   'uv' is in [0, 1]^N.
   minRadius >= 0
   maxRadius >= 0
   minRadius < maxRadius

   The annulus is considered as the set:
   {x | minRadius <= norm(x) <= minRadius}

   If 'uv' are random variables uniformly distributed
   on the square, then the returned points are random
   variables uniformly distributed on the annulus.
   */

    template <typename Real, integer N, RequiresC<(N == 1)> = 0>
    Vector<Real, N> uniformlySampleAnnulus(
        const Vector<Real, N>& uv,
        const NoDeduction<Real>& minRadius,
        const NoDeduction<Real>& maxRadius);

    template <typename Real, integer N, RequiresC<(N == 2)> = 0>
    Vector<Real, N> uniformlySampleAnnulus(
        const Vector<Real, N>& uv,
        const NoDeduction<Real>& minRadius,
        const NoDeduction<Real>& maxRadius);

    template <typename Real, integer N, RequiresC<(N == 3)> = 0>
    Vector<Real, N> uniformlySampleAnnulus(
        const Vector<Real, N>& uv,
        const NoDeduction<Real>& minRadius,
        const NoDeduction<Real>& maxRadius);

    //! Uniformly samples a point from a simplex.
    /*!
   Preconditions:
   'uv' is in [0, 1]^N.

   The simplex is considered as the set
   {x | sum(x) <= 1, allGreaterEqual(x, 0)}

   If 'uv' are random variables uniformly distributed
   on the cube, then the returned points are random
   variables uniformly distributed on the simplex.
   */

    template <typename Real, integer N, RequiresC<(N == 1)> = 0>
    Vector<Real, N> uniformlySampleSimplex(
        const Vector<Real, N>& uv);

    template <typename Real, integer N, RequiresC<(N == 2)> = 0>
    Vector<Real, N> uniformlySampleSimplex(
        const Vector<Real, N>& uv);

    template <typename Real, integer N, RequiresC<(N >= 3 || N == Dynamic)> = 0>
    Vector<Real, N> uniformlySampleSimplex(
        const Vector<Real, N>& uv);

    //! Uniformly samples a point from a ball.
    /*!
   Preconditions:
   'uv' is in [0, 1]^N.

   Returns:
   A point from the set {x in R^N | norm(x) <= 1}.

   If 'uv' is a uniformly distributed random variable on the cube,
   so is the returned value on the ball.
   */

    template <typename Real, integer N, RequiresC<(N == 1)> = 0>
    Vector<Real, N> uniformlySampleBall(
        const Vector<Real, N>& uv);

    template <typename Real, integer N, RequiresC<(N == 2)> = 0>
    Vector<Real, N> uniformlySampleBall(
        const Vector<Real, N>& uv);

    template <typename Real, integer N, RequiresC<(N == 3)> = 0>
    Vector<Real, N> uniformlySampleBall(
        const Vector<Real, N>& uv);

    // TODO: provide functions for 4d and up?

    //! Uniformly samples a point from a sphere.
    /*!
   Preconditions:
   'uv' is in [0, 1]^N

   Returns:
   A point from the set {x in R^(N + 1) | norm(x) = 1}.

   If 'uv' is a uniformly distributed random variable on the cube,
   so is the returned value on the sphere.
   */

    template <typename Real, integer N, RequiresC<(N == 1)> = 0>
    Vector<Real, ModifyN<N, N + 1>::Result> uniformlySampleSphere(
        const Vector<Real, N>& uv);

    template <typename Real, integer N, RequiresC<(N == 2)> = 0>
    Vector<Real, ModifyN<N, N + 1>::Result> uniformlySampleSphere(
        const Vector<Real, N>& uv);

    // TODO: provide functions for 4d and up?

    //! Uniformly samples a point from a hemisphere.
    /*!
   Preconditions:
   'uv' is in [0, 1]^N.

   Returns:
   A point from the set {x in R^(N + 1) | norm(x) <= 1, x[N] >= 0}.

   If 'uv' is a uniformly distributed random variable on the cube,
   so is the returned value on the hemisphere.
   */

    template <typename Real, integer N, RequiresC<(N == 1)> = 0>
    Vector<Real, ModifyN<N, N + 1>::Result>
        uniformlySampleHemisphere(
        const Vector<Real, N>& uv);

    template <typename Real, integer N, RequiresC<(N == 2)> = 0>
    Vector<Real, ModifyN<N, N + 1>::Result>
        uniformlySampleHemisphere(
        const Vector<Real, N>& uv);

    // TODO: provide functions for 4d and up?

    //! Samples a cosine-weighted point from a hemisphere.
    /*!
   Preconditions:
   'uv' is in [0, 1]^N.

   The hemisphere is considered as the set
   {x in R^(N+1) | norm(x) = 1, x[N] >= 0}

   If 'uv' are random variables uniformly distributed
   on the square, then the returned points are random
   variables cosine-distributed on the hemisphere.
   */

    template <typename Real, integer N>
    Vector<Real, ModifyN<N, N + 1>::Result> cosineSampleHemisphere(
        const Vector<Real, N>& uv);

}

#include "pastel/math/sampling/uniform_distortion.hpp"

#endif