When dealing with a multi-touch rotation I was searching for a simple method to calculate the angle of two fingers. Well, actually more precisely the angle between the vector from one finger to the second finger and the horizontal X Axis.
While I was still searching my friend Christian Pfandler came up with this function:
- (CGFloat)angleFromPoints:(CGPoint)pos1 otherPoint:(CGPoint)pos2 { CGPoint vector = CGPointMake(pos1.x-pos2.x, pos1.y - pos2.y); double angleCalc; if (vector.y < 0) { // upper Half angleCalc = atan2(-vector.y,vector.x); } else { angleCalc = atan2(vector.y,-vector.x)+M_PI; } return angleCalc; } |
The regular atan(x) function seem to have a limitation by only returning values between 0 and +/- PI. Because of this there is also the atan2(y,x) function which is orders of magnitude more useful. To get a continuos angle for the full circle we have to treat the upper half and the lower half seperately though. I found this here.
I don’t quite understand it, but it seems to work.
Please keep in mind though that like all angles in Cocoa Touch this is in radians as well. So not 0…360, but 0…2*PI. If you know an even simpler method, please let me know.
Categories: Recipes