Я столкнулся с этим вопросом в одном из моих интервью и был полностью в тупике. Единственное решение, о котором я мог думать, - это хранить currentAngle
в NSArray
для вычисления следующего угла.
Вопрос:
Переместите шарик на 35 пикселей по экрану с помощью компаса iPhone. Как только мяч находится в центре экрана, позвольте пользователю нажимать его на "reset". После reset мяч вернется в положение Min
. Помните, что компас может начинаться где-то между 0-359, задача состоит в том, чтобы найти ближайший угол захвата и сфокусироваться на этом угле, пока мяч не будет выровнен. Как только мяч будет выровнен и reset, iPhone переместится на следующий угол и так далее, пока мяч не станет reset 18
раз. 18 resets
* 20 degree angles
= 360
.
Назначенные переменные:
int currentAngle = (Ranging between 0-359) (Constant updates as the user twirls around)
int captureAngle = 20
int centerX = view.center.x (160) - 35 (size of ball)
int ballSize = 35 (ball.width/2)
Бумага выглядела примерно так:
Функция пока:
-(void)testMotion{
motionQueue = [[NSOperationQueue alloc] init];
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 1.0f / 60.0f;
if (([CMMotionManager availableAttitudeReferenceFrames] & CMAttitudeReferenceFrameXTrueNorthZVertical) != 0) {
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:motionQueue
withHandler:^(CMDeviceMotion *motion, NSError *error)
{
if (!error) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
CMAttitude *attitude = motion.attitude;
CMRotationMatrix rm = attitude.rotationMatrix;
// Get the heading.
double heading = M_PI + atan2(rm.m22, rm.m12);
heading = heading*180/M_PI;
int currentAngle = (int)heading;
NSLog(@"Current Angle: %d",currentAngle);
int captureAngle = 20; // 20 Degress Capture Angle
}];
}
}];
}
}