こんにちは、ポイントの座標を計算する効率的な方法があるかどうか疑問に思っていました (元の場所から距離 d 移動しました)。
ポイント P(0.3,0.5) があり、そのポイントを距離 d でランダムな方向に移動する必要があるとしましょう。
これまでのところ、新しい x 座標と y 座標をランダムに選択して、古い点と新しい点の間の距離が d に等しいかどうかを確認していました。それを行うにはあまり効率的な方法ではないことは承知しています。あなたならどうしますか??
ある点が与えられた場合、それから離れたところに(x1, y1)
ある「ランダムな」点を見つけたいと思います。(x2, y2)
d
ランダムな角度を選択しtheta
ます。それで:
x2 = x1 + d * cos(theta)
y2 = y1 + d * sin(theta)
d
これは、を中心とする半径の円上のランダムな点になります(x1, y1)
証明:
Distance between (x1, y1) and (x2, y2)
= sqrt ( (x2 - x1) ^ 2 + (y2 - y1) ^ 2)
= sqrt ( d^2 * (sin^2 (theta) + cos^2 (theta) ) )
= d
あなたは見たいかもしれません:
そのための式には、基本的な三角関数が含まれます。
new_x = old_x + Math.cos(angle) * distance;
new_y = old_y + Math.sin(angle) * distance;
ちなみに、角度はラジアンである必要があります。
radians = degrees * Math.PI / 180.0;
簡単な方程式を解く必要があります:
double dx_square = rand.NextDouble(d);
double dy_square = d - dx_square;
double dx = Math.Sqrt(dx_square);
double dy = Math.Sqrt(dy_square);
ポイントを移動する方向に制約がない場合、最も簡単な方法は、ポイントを1つの軸に沿って移動することです。
したがって、ポイントを1単位の距離だけ移動する必要がある場合、ポイントP(0.3,0.5)は、単純に次のいずれかになります:P(1.3,0.5)またはP(0.3,1.5)