从2个位置获取angular度

我有两个对象,当我移动一个我想从另一个angular度。

例如

Object1X = 211.000000, Object1Y = 429.000000 Object2X = 246.500000, Object2Y = 441.500000 

我已经尝试了以下和太阳下的每一个变化

 double radians = ccpAngle(Object1,Object2); double degrees = ((radians * 180) / Pi); 

但我只是得到2.949023返回我想要的东西像45度等

请帮忙

谢谢

乔纳森

这个其他答案有帮助吗?

如何将atan2()映射到0-360度

我写过这样的:

 - (CGFloat) pointPairToBearingDegrees:(CGPoint)startingPoint secondPoint:(CGPoint) endingPoint { CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians float bearingDegrees = bearingRadians * (180.0 / M_PI); // convert to degrees bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + bearingDegrees)); // correct discontinuity return bearingDegrees; } 

运行代码:

 CGPoint p1 = CGPointMake(10, 10); CGPoint p2 = CGPointMake(20,20); CGFloat f = [self pointPairToBearingDegrees:p1 secondPoint:p2]; 

而这返回45。

希望这可以帮助。

我修改了@tomas的解决scheme。 这可能(这是我的),这个math将被频繁地调用。

在我的化身,你必须自己执行两个点之间的差异(或者如果你是幸运的,(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环境中使用了这个方法,这就是我所说的:(math上,我们正在翻译平面使p0成为原点,因此从p1减去p0p0p0 = {0,0})。飞机翻译时不变。)

 CGPoint p0 = self.position; CGPoint p1 = other.position; CGPoint pnormal = ccpSub(p1, p0); CGFloat angle = CGPointToDegree(pnormal); 

ccpSub是由cocos2d提供的,它是一个元组的减法 – 如果你没有可用的话,你可以自己做

抛开一个问题:用CG___命名scheme来命名方法一般是不礼貌的风格, CG___命名scheme将该函数标识为CoreGraphics一部分 – 所以如果要将其重命名为MyConvertCGPointToBearing()FredLovesWilma()则应该这样做。

下面是我在Swift中为那些感兴趣的人做的,这是基于@ bshirley的回答上面w /一些修改,以帮助匹配的calayer旋转系统:

 extension CGPoint { func angle(to comparisonPoint: CGPoint) -> CGFloat { let originX = comparisonPoint.x - self.x let originY = comparisonPoint.y - self.y let bearingRadians = atan2f(Float(originY), Float(originX)) var bearingDegrees = CGFloat(bearingRadians).degrees while bearingDegrees < 0 { bearingDegrees += 360 } return bearingDegrees } } extension CGFloat { var degrees: CGFloat { return self * CGFloat(180.0 / M_PI) } } 

这提供了一个这样的坐标系统:

  270 180 0 90 

用法:

 point.angle(to: point2) CGPoint.zero.angle(to: CGPoint(x: 0, y: 1)) // 90 

两点之间没有angular度。 如果您想知道从原点(0,0)到对象的vector之间的angular度,请使用标量(点)产品:

 theta = arccos ( (veca dot vecb) / ( |veca| * |vecb| ) 

你正在使用的语言的mathstd库确实提供弧余弦,标量积和长度的函数。