Я намагаюся створити випадкові місця поблизу мого місцезнаходження. Мені потрібно створити випадкові пари широти / довготи в колі 200 метрів, що оточують моє місцезнаходження.
Це формула, яку я придумав (за допомогою людей на StackOverFlow): (Довільне число від -1 до 1) * радіус + (стара довгота) = нова довгота в радіусі старої довготи
(Випадкове число між -1 і 1) * радіус + (стара широта) = нова широта в радіусі старої широти
Вся справа в тому, що з моєю реалізацією відбувається щось дивне, оскільки всі випадкові місця розташовані занадто близько до мого центру локації, здається, що формула не охоплює весь радіус.
Будь-яке уявлення про те, що могло бути не так у моїй формулі?
Відредаговано, щоб показати поточну реалізацію 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;
}
Я не впевнений, що я роблю неправильно, адже нові локації створюються посеред моря.
Будь-яка ідея?
random.nextInt(1001)/1000
поверне значення, що перевищує 1, приблизно 0,1% часу. Чому ви не використовуєте random.nextDouble
або random.nextFloat
? (Б) Множення x0
і y0
на 1E6
досить таємниче; не здається, що це дасть правильні результати.