common: mathlib: add UniformPointOnSphere

This commit is contained in:
Eric Wasylishen 2016-08-09 17:20:51 -06:00
parent 1d4de5c17d
commit 79525b9aee
2 changed files with 15 additions and 3 deletions

View File

@ -77,10 +77,13 @@ VecStrf(const vec3_t vec)
// from http://mathworld.wolfram.com/SpherePointPicking.html
// eqns 6,7,8
void
RandomDir(vec3_t dir)
UniformPointOnSphere(vec3_t dir, float u1, float u2)
{
const vec_t theta = Random() * 2.0 * Q_PI;
const vec_t u = (2.0 * Random()) - 1.0;
assert(u1 >= 0 && u1 <= 1);
assert(u2 >= 0 && u2 <= 1);
const vec_t theta = u1 * 2.0 * Q_PI;
const vec_t u = (2.0 * u2) - 1.0;
const vec_t s = sqrt(1.0 - (u * u));
dir[0] = s * cos(theta);
@ -93,6 +96,13 @@ RandomDir(vec3_t dir)
}
}
void
RandomDir(vec3_t dir)
{
UniformPointOnSphere(dir, Random(), Random());
}
bool AABBsDisjoint(const vec3_t minsA, const vec3_t maxsA,
const vec3_t minsB, const vec3_t maxsB)
{

View File

@ -176,6 +176,8 @@ VectorNormalize(vec3_t v)
const char *VecStr(const vec3_t vec);
const char *VecStrf(const vec3_t vec);
// Maps uniform random variables U and V in [0, 1] to uniformly distributed points on a sphere
void UniformPointOnSphere(vec3_t dir, float u, float v);
void RandomDir(vec3_t dir);
bool AABBsDisjoint(const vec3_t minsA, const vec3_t maxsA, const vec3_t minsB, const vec3_t maxsB);
void AABB_Init(vec3_t mins, vec3_t maxs, const vec3_t pt);