我修改了@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 成为原点。因此从 p1 中减去 p0 (p0 - @ 987654327@ = {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()那么你应该这样做。