Tôi đang cố gắng tạo các vị trí ngẫu nhiên gần vị trí của tôi. Những gì tôi muốn là tạo các cặp vĩ độ / kinh độ ngẫu nhiên trong một vòng tròn 200 mét bao quanh vị trí của tôi.
Đây là công thức tôi đã đưa ra (với sự giúp đỡ của mọi người tại StackOverFlow): (Số ngẫu nhiên giữa -1 và 1) * radius + (kinh độ cũ) = kinh độ mới trong bán kính của kinh độ cũ
(Số ngẫu nhiên giữa -1 và 1) * radius + (vĩ độ cũ) = vĩ độ mới trong bán kính của vĩ độ cũ
Có một điều kỳ lạ đang xảy ra với việc triển khai của tôi vì tất cả các vị trí ngẫu nhiên đều ở quá gần trung tâm vị trí của tôi, có vẻ như công thức không bao gồm toàn bộ bán kính.
Bất kỳ ý tưởng về những gì có thể sai với công thức của tôi?
Đã chỉnh sửa để hiển thị triển khai java hiện tại:
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;
}
Tôi không chắc chắn những gì tôi đang làm sai, bởi vì các địa điểm mới được tạo ra giữa biển.
Bất kỳ ý tưởng?
random.nextInt(1001)/1000
sẽ trả về giá trị lớn hơn 1 khoảng 0,1% thời gian. Tại sao bạn không sử dụng random.nextDouble
hay random.nextFloat
? (ii) Nhân x0
và y0
bằng 1E6
là khá bí ẩn; có vẻ như nó sẽ không tạo ra kết quả chính xác.