2016-05-23 2 views
-1

У меня есть два положения и вы хотите вычислить положение, в котором находится красная звезда. (Я хочу, чтобы переместить B в «красной звездой месте», но я не знаю координат.)Найти ближайшую позицию по позиции цели на определенное расстояние

desc

У меня есть положение A и B и минимальное расстояние от позиции А. Так что мой вопрос заключается в том, как рассчитать ближайшее положение к B на указанном расстоянии.

Надеюсь, кто-то поймет, чего я пытаюсь достичь.

+0

Что делать, если B находился внутри внешнего круга? –

+0

- радиус вокруг известного? –

+0

Это 2D или 3D-пространство? – Hill

ответ

0

Предполагая, что:

  • Вы хотите B, чтобы быть в том же направлении от А, как и прежде
  • Вы хотите переместить B на определенное расстояние от A
    • Если B находится дальше , переместите его ближе к А, чтобы добраться до расстояния
    • Если расстояние B ближе определенного расстояния, отодвиньте его от А, чтобы добраться до расстояния

Тогда это способ сделать это:

  1. Вычислить текущее расстояние от А до В
  2. Вычислить разницу в положении между A и B (в 2-х или 3-х измерениях)
  3. Разделите эту разницу на коэффициент, равный «текущему расстоянию/желаемому расстоянию» Например, если текущее расстояние равно 2x как можно дальше от A, как вы хотите, вы разделите разность в позиции на 2
  4. Установите новый положение o F B будет A + новые различия

Вот некоторые примеры кода:

var wantedDistance = 40.0; 
var distance = Math.Sqrt((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y)); 
var diffX = B.x - A.x; 
var diffY = B.y - A.y; 

var ratio = distance/wantedDistance; 
var newDiffX = diffX/ratio; 
var newDiffY = diffY/ratio; 

var newB = new PointF(A.x + newDiffX, A.y + newDiffY); 

В комментарии вы говорите, что если B находится внутри радиуса, то она находится в диапазоне, так что не должно быть переехал. Вы бы просто справились с этим, сравнив distance с wantedDistance, а если ниже, то все готово. Просто добавьте эту строку кода после var distance = ... линии:

if (distance < wantedDistance) 
    return B; // or whatever you want to do when "done" 

Если вам нужно сделать это в 3D-пространстве, просто увеличить каждый расчет и дифференциал для обработки измерения Z, а также.

+0

Работал как шарм! :) Спасибо большое! – w20svn

Смежные вопросы