Ios 从2个位置获取角度

Ios 从2个位置获取角度,ios,cocos2d-iphone,Ios,Cocos2d Iphone,我有两个物体,当我移动其中一个物体时,我想得到另一个物体的角度 例如: Object1X = 211.000000, Object1Y = 429.000000 Object2X = 246.500000, Object2Y = 441.500000 我尝试了以下以及阳光下的各种变化: double radians = ccpAngle(Object1,Object2); double degrees = ((radians * 180) / Pi); 但是我刚刚得到了2.949023,我

我有两个物体,当我移动其中一个物体时,我想得到另一个物体的角度

例如:

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度等等。两个点之间没有角度。如果要知道从原点(0,0)到对象的向量之间的角度,请使用标量(点)积:


您正在使用的语言的数学标准库肯定提供了弧余弦、标量积和长度的函数。

其他答案有帮助吗

我是这样写的:

- (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;
}
        90
180              0
        270
运行代码:

CGPoint p1 = CGPointMake(10, 10);
CGPoint p2 = CGPointMake(20,20);

CGFloat f = [self pointPairToBearingDegrees:p1 secondPoint:p2];
这个返回45


希望这能有所帮助。

我修改了@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
-
p0
={0,0})。平移平面时角度不变。)

ccpSub
是由cocos2d提供的,它是元组的减法-如果没有,您可以自己做


旁白:用
CG\uuuuuu
命名方案来命名上述方法通常是不礼貌的,该命名方案将函数标识为
CoreGraphics
的一部分,因此如果您想将其重命名为
MyConvertCGPointToBearing()
FredLovesWilma()
那么你应该这样做。

以下是我在Swift中为那些感兴趣的人所做的,它基于上面@bshirley的答案,并进行了一些修改,以帮助与calayer旋转系统相匹配:

extension CGFloat {
    var degrees: CGFloat {
        return self * CGFloat(180) / .pi
    }
}

extension CGPoint {
    func angle(to comparisonPoint: CGPoint) -> CGFloat {
        let originX = comparisonPoint.x - x
        let originY = comparisonPoint.y - y
        let bearingRadians = atan2f(Float(originY), Float(originX))
        var bearingDegrees = CGFloat(bearingRadians).degrees

        while bearingDegrees < 0 {
            bearingDegrees += 360
        }

        return bearingDegrees
    }
}
用法:

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

角度的顶点是点(0,0)

考虑object1X=x1…object2Y=y2

Angle(object1-object2) = 
   90       * (  (1 + sign(x1)) * (1 - sign(y1^2))
               - (1 + sign(x2)) * (1 - sign(y2^2)) )
 + 45       * (  (2 + sign(x1)) * sign(y1)
               - (2 + sign(x2)) * sign(y2)         )
 + 180/pi() * sign(x1*y1) * atan( (abs(x1) - abs(y1)) / (abs(x1) + abs(y1)) )
 - 180/pi() * sign(x2*y2) * atan( (abs(x2) - abs(y2)) / (abs(x2) + abs(y2)) )
在Swift 5.1中

func angle(between starting: CGPoint, ending: CGPoint) -> CGFloat {
    let center = CGPoint(x: ending.x - starting.x, y: ending.y - starting.y)
    let radians = atan2(center.y, center.x)
    let degrees = radians * 180 / .pi
    return degrees > 0 ? degrees : degrees + degrees
}

什么点应该是角的顶点?假设原点,那么我得到两个物体之间的角度为2.986度。[**如何从两个位置获得角度**][1][1]:这是可行的,我相信我昨晚做的每件事都会奏效。事实证明,我是根据光标的位置而不是物体的位置,所以我认为我的读数是错误的。哎呀。感谢你的帮助意识到错误是成功的一半!爱你的回答,但需要说明的是,对于你的函数,有一个现有的cocos方法://瞄准枪浮动弧度=atan2(self.position.y-crosshairPosition.y,crosshairPosition.x-self.position.x);浮动度=CC_弧度到_度(弧度);枪。旋转=度;这把代码搞乱了,但我想你能看出来是什么。获得atan2后,您可以直接转换为CC_弧度。它背后的方法是你自己写的。这是正确的答案。接受的一个返回一个奇怪的角度值。您应该更正atan2f(点.x,点.y)带有
atan2f(点y、点x)(颠倒x和y)感谢您的捕获,@Matter-(参考:)-已修复。我如何在swift中实现这一点3@UmaMadhavi更新了一点答案,你只需要一个外部参数,但我使它符合新的设计准则?在点和点2的位置,我如何发送纬度和经度值。@UmaMadhavi,它需要基于地球曲率和坐标系的不同数学。我认为这个问题更适用于:
Angle(object1-object2) = 
   90       * (  (1 + sign(x1)) * (1 - sign(y1^2))
               - (1 + sign(x2)) * (1 - sign(y2^2)) )
 + 45       * (  (2 + sign(x1)) * sign(y1)
               - (2 + sign(x2)) * sign(y2)         )
 + 180/pi() * sign(x1*y1) * atan( (abs(x1) - abs(y1)) / (abs(x1) + abs(y1)) )
 - 180/pi() * sign(x2*y2) * atan( (abs(x2) - abs(y2)) / (abs(x2) + abs(y2)) )
func angle(between starting: CGPoint, ending: CGPoint) -> CGFloat {
    let center = CGPoint(x: ending.x - starting.x, y: ending.y - starting.y)
    let radians = atan2(center.y, center.x)
    let degrees = radians * 180 / .pi
    return degrees > 0 ? degrees : degrees + degrees
}