double = rollingZ = acceleration.x;
double = rollingX = acceleration.y;
if (rollingZ > 0.0) {
self.centerCoordinate.inclination = atan(rollingX / rollingZ) + M_PI / 2.0; //LINE 1
}
else if (rollingZ < 0.0) {
self.centerCoordinate.inclination = atan(rollingX / rollingZ) - M_PI / 2.0; // LINE 2
}
else if (rollingX < 0) {
self.centerCoordinate.inclination = M_PI/2.0; //atan returns a radian
}
else if (rollingX >= 0) {
self.centerCoordinate.inclination = 3 * M_PI/2.0;
Я просто пытаюсь полностью понять этот кусок кода. Я собираюсь создавать приложения AR на iphone, и этот код имеет функцию вычисления угла наклона устройства с использованием показаний акселерометра.
Мое понимание таково:
Предполагая книжную ориентацию, если я поверну устройство вперед, ось акселерометра увеличивается в сторону отрицательного значения -1,0 (т.е. устройство разложено горизонтально экраном вверх). Если я наклоню устройство ко мне, значение оси x увеличится до значения 1,0 (пока устройство не станет плоским, обращенным к земле).
Ось Y изменяется вверх и вниз по оси от -1,0 до 0,0 (0 означает, что устройство находится в горизонтальном положении).
Если мы возьмем некоторые показания, скажем, x = 0,5 (угол -45 градусов, наклон устройства к себе) и y = 0,8. Если я построил это на графике декартовых координат с y (перекатывающимся X в качестве вертикальной оси) и x (перекатывающимся Z в качестве горизонтального) и проведу линию между ними, я понимаю, что могу использовать функцию обратного тангенса (atan) для вычисления угла. Моя путаница возникает в строке 1. Я не понимаю, почему эта линия добавляет 90 градусов (в радианах) к вычисленному углу, заданному функцией atan?
Я просто не могу представить на графике, что происходит. Если бы кто-то мог пролить свет на это - это было бы очень ценно.