Próbuję utworzyć losowe lokalizacje w pobliżu mojej lokalizacji. Chcę stworzyć losowe pary szerokości i długości geograficznej wewnątrz 200-metrowego okręgu otaczającego moją lokalizację.
Oto formuła, którą wymyśliłem (z pomocą ludzi z StackOverFlow): (Losowa liczba od -1 do 1) * promień + (stara długość geograficzna) = nowa długość w promieniu starej długości geograficznej
(Liczba losowa od -1 do 1) * promień + (stara szerokość geograficzna) = nowa szerokość w promieniu starej szerokości geograficznej
Chodzi o to, że coś dziwnego dzieje się z moją implementacją, ponieważ wszystkie losowe lokalizacje znajdują się zbyt blisko centrum lokalizacji, wydaje się, że formuła nie obejmuje całego promienia.
Masz pojęcie, co może być nie tak z moją formułą?
Edytowane, aby pokazać bieżącą implementację Java:
public static Location getLocation(Location location, int radius) {
Random random = new Random();
// Convert radius from meters to degrees
double radiusInDegrees = radius / METERS_IN_DEGREES;
double x0 = location.getLongitude() * 1E6;
double y0 = location.getLatitude() * 1E6;
double u = random.nextInt(1001) / 1000;
double v = random.nextInt(1001) / 1000;
double w = radiusInDegrees * Math.sqrt(u);
double t = 2 * Math.PI * v;
double x = w * Math.cos(t);
double y = w * Math.sin(t);
// Adjust the x-coordinate for the shrinking of the east-west distances
double new_x = x / Math.cos(y0);
// Set the adjusted location
Location newLocation = new Location("Loc in radius");
newLocation.setLongitude(new_x + x0);
newLocation.setLatitude(y + y0);
return newLocation;
}
Nie jestem pewien, co robię źle, ponieważ nowe lokalizacje są tworzone na środku morza.
Dowolny pomysł?
random.nextInt(1001)/1000
zwróci wartość większą niż 1 przez około 0,1% czasu. Dlaczego nie używasz random.nextDouble
lub random.nextFloat
? (ii) Mnożenie x0
i y0
przez 1E6
jest raczej tajemnicze; nie wydaje się, aby przyniosło prawidłowe wyniki.