c # - как переместить точку на заданное расстояние d (и получить новые координаты) - PullRequest
6 голосов
/ 05 января 2011

Привет Мне было интересно, есть ли эффективный способ вычисления координат точки (которая была перемещена на расстояние d от ее первоначального местоположения).

Допустим, у меня есть точка P (0.3,0.5), и мне нужно переместить эту точку в произвольном направлении на расстояние d.

До сих пор я делал это путем случайного выбора новых координат x и y и проверял, равно ли расстояние между старой и новой точкой d. Я понимаю, что это не слишком эффективный способ сделать это. Как бы ты это сделал ??

Ответы [ 4 ]

17 голосов
/ 05 января 2011

Учитывая точку (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

Возможно, вы захотите посмотреть:

8 голосов
/ 05 января 2011

Формула для этого включает в себя основные функции триггера.

new_x = old_x + Math.cos(angle) * distance;
new_y = old_y + Math.sin(angle) * distance;

Кстати, угол должен быть в радианах.

radians = degrees * Math.PI / 180.0;
0 голосов
/ 05 января 2011

Вам необходимо решить простое уравнение:

double dx_square = rand.NextDouble(d);
double dy_square = d - dx_square;
double dx = Math.Sqrt(dx_square);
double dy = Math.Sqrt(dy_square);
0 голосов
/ 05 января 2011

Если нет никаких ограничений относительно того, в каком направлении должна двигаться точка, самый простой способ - переместить ее только по одной оси.

Итак, если вам нужно переместить точку на расстояние 1 единица, ваша точка P (0.3,0.5) может просто стать одной из следующих: P (1,3,0,5) или Р (0.3,1.5)

...