From 72e24aa7918c97993cb115fb59dcf4102f0447d2 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Tue, 9 Mar 2021 18:03:32 +0000 Subject: [PATCH] (#35) Add Random.NextUnitVector3 --- .../RandomExtensions.Numerics.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/X10D/src/RandomExtensions/RandomExtensions.Numerics.cs b/X10D/src/RandomExtensions/RandomExtensions.Numerics.cs index 61fd8dc..b6c47b6 100644 --- a/X10D/src/RandomExtensions/RandomExtensions.Numerics.cs +++ b/X10D/src/RandomExtensions/RandomExtensions.Numerics.cs @@ -31,6 +31,33 @@ namespace X10D.RandomExtensions return new Vector2(x, y); } + + /// + /// Returns a with magnitude 1 whose components indicate a random point on the unit sphere. + /// + /// The instance + /// + /// A whose returns 1, and whose components indicate a random + /// point on the unit sphere. + /// + public static Vector3 NextUnitVector3(this Random random) + { + if (random is null) + { + throw new ArgumentNullException(nameof(random)); + } + + var seed = random.Next(); + var seededRandom = new Random(seed); + + var angle = seededRandom.NextSingle(0, 360).DegreesToRadians(); + var z = seededRandom.NextSingle(-1, 1); + var mp = MathF.Sqrt(1 - z * z); + var x = mp * MathF.Cos(angle); + var y = mp * MathF.Sin(angle); + + return new Vector3(x, y, z); + } } }