iOS usando acelerómetro para mover un object dentro de un círculo

Estoy intentando usar el acelerómetro para mover una image dentro de un círculo. Estoy teniendo problemas cuando la image llega al borde del círculo, simplemente se mueve al otro lado del círculo. Mi código está debajo:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { //NSLog(@"x : %g", acceleration.x); //NSLog(@"y : %g", acceleration.y); //NSLog(@"z : %g", acceleration.z); delta.x = acceleration.x * 10; delta.y = acceleration.y * 10; joypadCap.center = CGPointMake(joypadCap.center.x + delta.x, joypadCap.center.y - delta.y); distance = sqrtf(((joypadCap.center.x - 160) * (joypadCap.center.x - 160)) + ((joypadCap.center.y -206) * (joypadCap.center.y - 206))); //NSLog(@"Distance : %f", distance); touchAngle = atan2(joypadCap.center.y, joypadCap.center.x); NSLog(@"Angle : %f", touchAngle); if (distance > 50) { joypadCap.center = CGPointMake(160 - cosf(touchAngle) * 50, 206 - sinf(touchAngle) * 50); } 

Estaba teniendo el mismo problema al intentar implementar un nivel de burbuja circular usando CMDeviceMotion. Descubrí que era un problema con las coorderadas pasadas a atan2(y,x) . Esta function requiere coorderadas cartesianas, con (0,0) en el centro de la vista. Sin embargo, las coorderadas de la pantalla tienen (0,0) en la esquina superior izquierda. Creé methods para convertir un punto entre los dos sistemas de coorderadas, y ahora está funcionando bien.

Puse un ejemplo de proyecto aquí en github, pero esta es la parte más importante:

 float distance = sqrtf(((point.x - halfOfWidth) * (point.x - halfOfWidth)) + ((point.y - halfOfWidth) * (point.y - halfOfWidth))); if (distance > maxDistance) { // Convert point from screen coordinate system to cartesian coordinate system, // with (0,0) located in the centre of the view CGPoint pointInCartesianCoordSystem = [self convertScreenPointToCartesianCoordSystem:point inFrame:self.view.frame]; // Calculate angle of point in radians from centre of the view CGFloat angle = atan2(pointInCartesianCoordSystem.y, pointInCartesianCoordSystem.x); // Get new point on the edge of the circle point = CGPointMake(cos(angle) * maxDistance, sinf(angle) * maxDistance); // Convert back to screen coordinate system point = [self convertCartesianPointToScreenCoordSystem:point inFrame:self.view.frame]; } 

Y:

 - (CGPoint)convertScreenPointToCartesianCoordSystem:(CGPoint)point inFrame:(CGRect)frame { float x = point.x - (frame.size.width / 2.0f); float y = (point.y - (frame.size.height / 2.0f)) * -1.0f; return CGPointMake(x, y); } - (CGPoint)convertCartesianPointToScreenCoordSystem:(CGPoint)point inFrame:(CGRect)frame { float x = point.x + (frame.size.width / 2.0f); float y = (point.y * -1.0f) + (frame.size.height / 2.0f); return CGPointMake(x, y); }