Нахождение CGPoint путем добавления к расстоянию двух CGPoints

У меня есть две CGPoints A и B. Расстояние между A и B можно найти с помощью ccpDistance(A,B).

С этой информацией мне нужно программно найти CGPoint(x,y) X, добавив небольшое расстояние к расстоянию AB. A-B может создавать соединительную линию в горизонтальной, вертикальной, диагональной или любой другой ориентации. Цель состоит в том, чтобы продолжить воображаемую линию и найти точку на ее конце.

Возможно ли это в Box2D для iOS? Если да, то как?

          X            Y   X
         /               .  \ 
        /                  . \
       B                     .B
      /                        \
     /                          \
    /                            \
   /                              \
  A                                A

person WaJiyaz    schedule 23.03.2011    source источник


Ответы (3)


Используйте следующую функцию (поместите ее в один из ваших .h файлов):

static inline CGPoint
ccpLineExtend(const CGPoint v1, const CGPoint v2, const CGFloat extension)
{
    double angle = atan2(v2.y - v1.y, v2.x - v1.x);
    return ccp(v2.x + extension * cos(angle), v2.y + extension * sin(angle));
}
person Lukman    schedule 23.03.2011
comment
Большое спасибо. Это работает как шарм для первой фигуры. Он не учитывает обратный угол, как на рисунке 2. Он дает точку Y на пунктирном расстоянии. Я очень надеюсь, что вы можете предоставить решение и для этого. - person WaJiyaz; 23.03.2011
comment
@WJK: Вы уверены, что правильно рассчитали? Поскольку простая проверка ccpLineExtend(ccp(3, 0), ccp(0, 4), 5.0) дает правильное -3.0, 8.0 .. тригонометрическая формула не может быть неправильной. Ах да, если вы хотите использовать его в Box2D, не забудьте разделить компоненты x и y на PTM_RATIO. - person Lukman; 23.03.2011
comment
Ты прав. Это прямая тригонометрия. У меня это происходит только для угла между 90-135 градусами. Может быть, потому что я загружаю много вычислений, поэтому на это может влиять какое-то значение. Спасибо. - person WaJiyaz; 23.03.2011
comment
какое-то другое значение влияло на lineExtend, теперь это решено. Спасибо еще раз :) - person WaJiyaz; 23.03.2011

Я предлагаю следующий метод, который не использует никаких треугольных функций. Я предполагаю, что это быстрее, чем предложение Лукмана, но я не измерял время.

static inline CGPoint ccpLineExtend(const CGPoint from, const CGPoint to, const CGFloat factor)
{
    return CGPointMake(from.x + factor * (to.x - from.x), from.y + factor * (to.y - from.y));
}

factor = 1.0 означает, что полученная точка равна точке to. factor = 2.0 означает, что результирующая точка в два раза дальше от from, чем to.

person Lars Blumberg    schedule 28.08.2012

@ Ответ Ларса был для меня лучшим и самым простым. Вот версия Swift 4:

let newPoint = CGPoint(x: origin.x + factor * (end.x - origin.x), y: origin.y + factor * (end.y - origin.y))

Если у вас есть текущее расстояние, вы можете добавить и вычесть из него или вообще изменить его, рассчитав:

let factor = newDistance/currentDistance

В моем случае у меня был калькулятор расстояния от CGPoint до CGPoint с использованием расширения:

extension CGPoint {
    func distance(to point: CGPoint) -> CGFloat {
        let x = self.x - point.x
        let y = self.y - point.y
        return sqrt(pow(x, 2) + pow(y, 2))
    }
}
person Jacobo Koenig    schedule 07.05.2019