Предполагая, что:
- Вы хотите B, чтобы быть в том же направлении от А, как и прежде
- Вы хотите переместить B на определенное расстояние от A
- Если B находится дальше , переместите его ближе к А, чтобы добраться до расстояния
- Если расстояние B ближе определенного расстояния, отодвиньте его от А, чтобы добраться до расстояния
Тогда это способ сделать это:
- Вычислить текущее расстояние от А до В
- Вычислить разницу в положении между A и B (в 2-х или 3-х измерениях)
- Разделите эту разницу на коэффициент, равный «текущему расстоянию/желаемому расстоянию» Например, если текущее расстояние равно 2x как можно дальше от A, как вы хотите, вы разделите разность в позиции на 2
- Установите новый положение 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, а также.
Что делать, если B находился внутри внешнего круга? –
- радиус вокруг известного? –
Это 2D или 3D-пространство? – Hill