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