Я изменил решение @tomas для оптимизации. Вполне вероятно (это было для меня), что эту математику будут часто называть.
В моем воплощении вы должны выполнить разницу между двумя точками самостоятельно (или, если вам повезет, (0,0) уже является одной из ваших точек). Расчетное значение - это направление точки от (0,0). Да, это достаточно просто, и вы могли бы вставить это, если вы действительно хотите. Я предпочитаю более читаемый код.
Я также преобразовал его в вызов функции:
CGFloat CGPointToDegree(CGPoint point) {
// Provides a directional bearing from (0,0) to the given point.
// standard cartesian plain coords: X goes up, Y goes right
// result returns degrees, -180 to 180 ish: 0 degrees = up, -90 = left, 90 = right
CGFloat bearingRadians = atan2f(point.y, point.x);
CGFloat bearingDegrees = bearingRadians * (180. / M_PI);
return bearingDegrees;
}
Если вам не нужны отрицательные значения, вам нужно преобразовать их самостоятельно. Отрицательные значения были хороши для меня - нет необходимости делать ненужные вычисления.
Я использовал это в среде cocos2d, вот как я это называю: (Математически мы переводим плоскость, чтобы сделать p0
источник. Таким образом вычитая p0
из p1
(p0
- p0
= {0,0}). Углы неизменны при переводе плоскости.)
CGPoint p0 = self.position;
CGPoint p1 = other.position;
CGPoint pnormal = ccpSub(p1, p0);
CGFloat angle = CGPointToDegree(pnormal);
ccpSub
предоставляется cocos2d, это вычитание кортежа - вы можете сделать это самостоятельно, если у вас его нету
в сторону: обычно не вежливо называть метод, как указано выше, с помощью схемы именования CG___
, которая определяет функцию как часть CoreGraphics
- так что если вы хотите переименовать ее в MyConvertCGPointToBearing()
или FredLovesWilma()
тогда ты должен сделать это.