Интервью - позиционирование и сброс мяча в центре

Я столкнулся с этим вопросом в одном из моих интервью и был полностью в тупике. Единственное решение, о котором я мог думать, - это хранить 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

                 }];
             }
         }];
    }
}

Ответ 1

Если я понял тебя, тогда это что-то вроде этого: вычислить движение x и y от угла (видеть https://en.wikipedia.org/wiki/Rotation_of_axes

http://keisan.casio.com/has10/SpecExec.cgi?id=system/2006/1223522781 )

Затем переместите шар в соответствии с этими значениями, и если он сдвинется на угол 20 - разрешите reset или выйдите из цикла (для вашего выбора)

    while(1) {

    x = r \cos(currentAngle)

    y = r \sin(currentAngle)

    //change the ball position, 
    ball.position.x += x*speed
    ball.position.y += y*speed

    //check if angel is +20 or -20
    if (((currentAngle + 20) % 360) != captureAngle && (abs(currentAngle - 20) % 360) != captureAngle)) {
        allow_reset_ball = true
        break;
    }
}