50#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_DISTRIBUTION_TRANSFORMATIONS_H
51#define LASS_GUARDIAN_OF_INCLUSION_NUM_DISTRIBUTION_TRANSFORMATIONS_H
65const prim::Point3D<T> uniformSphere(
const prim::Point2D<T>& sample, T& pdf)
67 const T z = 1 - 2 * sample.x;
68 const T rho = sqrt(std::max<T>(0, 1 - z * z));
69 const T theta = 2 * num::NumTraits<T>::pi * sample.y;
70 pdf =
inv(4 * num::NumTraits<T>::pi);
71 return prim::Point3D<T>(rho * cos(theta), rho * sin(theta), z);
77const prim::Point3D<T> uniformHemisphere(
const prim::Point2D<T>& sample, T& pdf)
80 const T rho = sqrt(std::max<T>(0, 1 - z * z));
81 const T theta = 2 * num::NumTraits<T>::pi * sample.y;
82 pdf =
inv(2 * num::NumTraits<T>::pi);
83 return prim::Point3D<T>(rho * cos(theta), rho * sin(theta), z);
89const prim::Point3D<T> uniformCone(
const prim::Point2D<T>& sample, T minCosTheta, T& pdf)
91 const T z = minCosTheta + sample.x * (1 - minCosTheta);
92 const T rho = sqrt(std::max<T>(0, 1 - z * z));
93 const T theta = 2 * NumTraits<T>::pi * sample.y;
94 pdf =
inv(2 * NumTraits<T>::pi * (1 - minCosTheta));
95 return prim::Point3D<T>(rho * cos(theta), rho * sin(theta), z);
101const prim::Point2D<T> uniformDisk(
const prim::Point2D<T>& sample, T& pdf)
104 const T x = 2 * sample.x - 1;
105 const T y = 2 * sample.y - 1;
106 const T pi_4 = num::NumTraits<T>::pi / 4;
113 theta = pi_4 * (y / x);
118 theta = pi_4 * (2 - (x / y));
126 theta = pi_4 * (4 + (y / x));
133 theta = pi_4 * (6 - (x / y));
142 pdf =
inv(NumTraits<T>::pi);
143 return prim::Point2D<T>(rho * cos(theta), rho * sin(theta));
149const prim::Point3D<T> cosineHemisphere(
const prim::Point2D<T>& sample, T& pdf)
151 const prim::Point2D<T> xy = uniformDisk(sample, pdf);
152 const T z = num::sqrt(std::max(T(), 1 - xy.position().squaredNorm()));
154 return prim::Point3D<T>(xy.x, xy.y, z);
161T uniformToExponential(T
uniform, T sigma, T& pdf)
164 return sigma > 0 ? (-num::log1p(std::max<T>(-1, -
uniform)) / sigma) : NumTraits<T>::infinity;
T inv(const T &x)
return x ^ -1
numeric types and traits.
Library for Assembled Shared Sources.