Ich versuche, zufällige Standorte in der Nähe meines Standorts zu erstellen. Ich möchte zufällige Längen- und Breitengrade in einem 200-Meter-Kreis um meinen Standort erstellen.
Dies ist die Formel, die ich (mithilfe von Leuten bei StackOverFlow) gefunden habe: (Zufallszahl zwischen -1 und 1) * Radius + (alter Längengrad) = neuer Längengrad innerhalb des Radius des alten Längengrads
(Zufallszahl zwischen -1 und 1) * Radius + (alter Breitengrad) = neuer Breitengrad innerhalb des Radius des alten Breitengrads
Die Sache ist, dass mit meiner Implementierung etwas Seltsames passiert, weil alle zufälligen Orte zu nahe an meinem Standortzentrum liegen. Es scheint, dass die Formel nicht den gesamten Radius abdeckt.
Irgendeine Idee, was mit meiner Formel falsch sein könnte?
Bearbeitet, um die aktuelle Java-Implementierung anzuzeigen:
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;
}
Ich bin mir nicht sicher, was ich falsch mache, weil die neuen Orte mitten auf dem Meer entstehen.
Irgendeine Idee?
random.nextInt(1001)/1000
wird in etwa 0,1% der Fälle ein Wert größer als 1 zurückgegeben. Warum benutzt du nicht random.nextDouble
oder random.nextFloat
? (ii) Multipliziert x0
und y0
durch 1E6
ist ziemlich mysteriös; es scheint nicht so, als würde es zu korrekten Ergebnissen führen.