Saya mencoba membuat lokasi acak di dekat lokasi saya. Yang saya inginkan adalah membuat pasangan garis lintang / bujur secara acak di dalam lingkaran 200 meter di sekitar lokasi saya.
Ini adalah rumus yang saya buat (dengan bantuan orang-orang di StackOverFlow): (Angka acak antara -1 dan 1) * radius + (bujur lama) = bujur baru dalam radius bujur lama
(Angka acak antara -1 dan 1) * radius + (lintang lama) = lintang baru dalam radius lintang lama
Masalahnya adalah bahwa ada sesuatu yang aneh terjadi dengan implementasi saya karena semua lokasi acak terlalu dekat dengan pusat lokasi saya, tampaknya rumus tersebut tidak mencakup seluruh jari-jari.
Adakah yang tahu apa yang salah dengan formula saya?
Diedit untuk menampilkan implementasi java saat ini:
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;
}
Saya tidak yakin apa yang saya lakukan salah, karena lokasi baru dibuat di tengah laut.
Ada ide?
random.nextInt(1001)/1000
akan mengembalikan nilai lebih besar dari 1 sekitar 0,1% dari waktu Mengapa Anda tidak menggunakan random.nextDouble
atau random.nextFloat
? (ii) Mengalikan x0
dan y0
oleh 1E6
agak misterius; sepertinya tidak akan menghasilkan hasil yang benar.