the result of the angle between my touch and the middle,bottom of the screen gives me 180 when the touch is on the right side of the screen, and 0 when it is on the left. I don't understand why...

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    let refPoint = CGPointMake(self.frame.size.width/2, self.frame.size.height)
    let anyTouch: UITouch = touches.anyObject() as UITouch
    let touch = anyTouch.locationInView(self.view!)

    //180 is inversed? 180 is when touch is on the right side...
    let dy = (refPoint.y - touch.y) //opposite
    let dx = (refPoint.x - touch.x) //adjacent

    let rad = atan2(dy, dx)
    let angle = rad * 180 / CGFloat(M_PI)
    println("angle : \(angle) ")

Would someone know how to solve this?



You're not taking into account the inverted Y axis in comparison to the normal X axis in most (maybe all?) programming languages. The top left corner of the screen is (0, 0), and is positive in the right and down directions.

So if the bottom middle of your screen is, for example, (300, 400), and you click at (0, 400), then your triangle will be a first quadrant triangle instead of the second quadrant triangle you expected.

let dy = (refPoint.y - touch.y) --> let dy = (400 - 400)

let dx = (refPoint.x - touch.x) --> let dx = (400 - 0)

This will give you a triangle with two points at (300, 400) and one point at (400, 400) in the normal X/Y coordinate plane. Therefore, to fix this, simply change your code to:

let dy = (refPoint.y - touch.y)
let dx = (touch.x - refPoint.x)

This should fix your inversed angles issue. Something you should note however is that since the Y axis is inverted, it causes the coordinate plane to be practically "flipped" across the X axis, and that angles in screen space will increase going clockwise and decrease going counterclockwise.

Hope this helps!

| improve this answer | |
  • \$\begingroup\$ You might also want to add that, in screen space, angles increase clockwise unlike math class where they increase counterclockwise. \$\endgroup\$ – John K Mar 4 '15 at 1:30

You wil want to subtract the touch with the ref point:

//180 is inversed? 180 is when touch is on the right side...
let dy = (touch.y - refPoint.y) //opposite
let dx = (touch.x - refPoint.x) //adjacent

This results in the (dx, dy) vector being from the refPoint to the touch point (as you would expect).

| improve this answer | |
  • \$\begingroup\$ thanks ratchetfreak, it was indeed right, except the dy should be (ref.y - touch.y) . otherwise it gives negative values. Thank you very much for the answer \$\endgroup\$ – Paul Mar 4 '15 at 16:05
  • 1
    \$\begingroup\$ negative values can be handled by adding 2pi to the result \$\endgroup\$ – ratchet freak Mar 4 '15 at 16:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.