Obtenga ángulo desde 2 posiciones

Tengo 2 objects y cuando muevo uno quiero get el ángulo del otro.

Por ejemplo

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

He probado lo siguiente y todas las variaciones bajo el sol

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

Pero acabo de get 2.949023 devuelto donde quiero algo así como 45 grados, etc.

Por favor ayuda

Gracias

Jonathan

¿Ayuda esta otra respuesta?

Cómo mapear atan2 () a grados 0-360

Lo he escrito así:

 - (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; } 

Ejecución del código:

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

Y esto vuelve 45.

Espero que esto ayude.

Modifiqué la solución de @tomas para ser optimizada. Es probable (fue para mí) que esta matemática se llame con frecuencia.

En mi encarnación, debes realizar la diferencia entre los dos puntos tú mismo (o si tienes suerte, (0,0) ya es uno de tus puntos). El valor que se calcula es la dirección del punto desde (0,0). Sí, eso es bastante simple y podrías hacerlo si realmente quieres. Mi preference es por un código más legible.

También lo convertí a una llamada de function:

 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; } 

Si no quiere valores negativos, debe convertirlos usted mismo. Los valores negativos estaban bien para mí, sin necesidad de hacer cálculos innecesarios.

Utilicé esto en un entorno cocos2d, así lo llamo: (Matemáticamente, estamos traduciendo el plano para hacer p0 el origen. Por lo tanto, restamos p0 de p1 ( p0p0 = {0,0}). Los angularjs son sin cambios cuando el avión se traduce).

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

ccpSub es proporcionado por cocos2d, es la resta de una tupla, puedes hacerlo tú mismo si no tienes esa disponible

A un lado: generalmente no es un estilo cortés nombrar el método como el anterior con el esquema de nombre CG___ , que identifica la function como parte de CoreGraphics , así que si quieres cambiarle el nombre a MyConvertCGPointToBearing() o FnetworkingLovesWilma() entonces deberías hacerlo.

Así es como lo hago en Swift para aquellos interesados, se basa en la respuesta de @ bshirley arriba con algunas modificaciones para ayudar a igualar el sistema de rotation de 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) } } 

Esto proporciona un sistema de coorderadas como este:

  270 180 0 90 

Uso:

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

No hay ángulo entre dos puntos. Si desea conocer el ángulo entre los vectores del origen (0,0) a los objects, use el producto escalar (punto):

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

El estándar matemático del lenguaje que está utilizando seguramente proporciona funciones para el coseno arcus, el producto escalar y la longitud.