diff --git a/include/rng.h b/include/rng.h index d1252b8..276e3d3 100644 --- a/include/rng.h +++ b/include/rng.h @@ -14,6 +14,7 @@ uint32_t rng_uint32(rng_t *rng); double rng_canon(rng_t *rng); double rng_plusminus(rng_t *rng); vec3_t rng_vec3(rng_t *rng); +vec3_t rng_xy(rng_t *rng); vec3_t rng_gaussian_xy(rng_t *rng, double stddev); #endif diff --git a/src/rng.c b/src/rng.c index 3ba51d8..0dc30c4 100644 --- a/src/rng.c +++ b/src/rng.c @@ -42,6 +42,13 @@ vec3_t rng_vec3(rng_t *rng) return vec3_unit(v); } +vec3_t rng_xy(rng_t *rng) +{ + const double theta = 2.0 * M_PI * rng_canon(rng); + const double mag = rng_canon(rng); + return (vec3_t) { .x = mag * cos(theta), .y = mag * sin(theta) }; +} + vec3_t rng_gaussian_xy(rng_t *rng, double stddev) { const double r1 = rng_canon(rng);