From e6d5802bba96420a529fd20e4cc8dc914acfb471 Mon Sep 17 00:00:00 2001 From: Leaf26 Date: Thu, 26 Aug 2021 15:12:26 -0400 Subject: [PATCH] flatten random distribution (#79) The circle calculation leaned towards the outer edge. A new donut calculation flattens that issue --- .../BetterRTP/references/worlds/WorldPlayer.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/WorldPlayer.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/WorldPlayer.java index 0cfa6a8..6bbb7f6 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/WorldPlayer.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/worlds/WorldPlayer.java @@ -164,11 +164,17 @@ public class WorldPlayer implements RTPWorld { } private Location generateRound(int maxRad, int min) { - //Generate a random X and Z based off the quadrant selected + //Generate a random X and Z based off location on a spiral curve int max = maxRad - min; int x, z; - double r = max * Math.sqrt(new Random().nextDouble()) + min; - double theta = (new Random().nextDouble()) * 2 * Math.PI; + + double area = Math.PI * (max - min) * (max + min); //of all the area in this donut + double subArea = area * new Random().nextDouble(); //pick a random subset of that area + + Double r = Math.sqrt(subArea/Math.PI + min*min); //convert area to radius + double theta = (r - r.intValue()) * 2 * Math.PI; //use the remainder as an angle + + // polar to cartesian x = (int) (r * Math.cos(theta)); z = (int) (r * Math.sin(theta)); x += getCenterX();