From 79525b9aeecec4c0841269eabb7ce2d6393f0964 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Tue, 9 Aug 2016 17:20:51 -0600 Subject: [PATCH] common: mathlib: add UniformPointOnSphere --- common/mathlib.c | 16 +++++++++++++--- include/common/mathlib.h | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/common/mathlib.c b/common/mathlib.c index 9c4fd451..28701647 100644 --- a/common/mathlib.c +++ b/common/mathlib.c @@ -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) { diff --git a/include/common/mathlib.h b/include/common/mathlib.h index 01e0130f..a3823dc0 100644 --- a/include/common/mathlib.h +++ b/include/common/mathlib.h @@ -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);