ฉันกำลังพยายามสร้างตำแหน่งสุ่มที่อยู่ใกล้กับตำแหน่งของฉัน สิ่งที่ฉันต้องการคือการสร้างคู่ละติจูด / ลองจิจูดแบบสุ่มภายในวงกลม 200 เมตรรอบ ๆ สถานที่ของฉัน
นี่คือสูตรที่ฉันคิดขึ้นมา (ด้วยความช่วยเหลือของผู้คนที่ StackOverFlow): (สุ่มตัวเลขระหว่าง -1 ถึง 1) * รัศมี + (ลองจิจูดเก่า) = ลองจิจูดใหม่ภายในรัศมีลองจิจูดเก่า
(ตัวเลขสุ่มระหว่าง -1 ถึง 1) * รัศมี + (ละติจูดเก่า) = ละติจูดใหม่ภายในรัศมีของละติจูดเก่า
สิ่งที่เป็นสิ่งที่แปลกเกิดขึ้นกับการใช้งานของฉันเพราะสถานที่สุ่มทั้งหมดอยู่ใกล้กับศูนย์ตำแหน่งของฉันมากเกินไปดูเหมือนว่าสูตรจะไม่ครอบคลุมรัศมีทั้งหมด
ความคิดเกี่ยวกับสิ่งที่อาจผิดกับสูตรของฉัน?
แก้ไขเพื่อแสดงการใช้จาวาปัจจุบัน:
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
? (ii) การคูณx0
และy0
โดย1E6
ค่อนข้างลึกลับ ดูเหมือนว่าจะให้ผลลัพธ์ที่ถูกต้อง