自分の場所の近くにランダムな場所を作成しようとしています。私が欲しいのは、私の場所を囲む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
約0.1%の時間で1より大きい値を返します。random.nextDouble
またはを使用しないのはなぜrandom.nextFloat
ですか?(ii)乗算x0
とy0
バイ1E6
はかなり不可解です。正しい結果が得られるとは思えません。