Угол наклона устройства Android по вертикальной оси, когда устройство остается неподвижным

Я разрабатываю свое первое приложение, и для некоторых расчетов мне нужен угол вертикальной оси. В основном я пытаюсь сделать простой инструмент измерения, который будет выполнять вычисления при нажатии кнопки. У меня есть высота (H), в которой находится устройство, и мне нужен угол вертикальной оси устройства. Имея эти значения, я смогу вычислить sin и так далее.

Я пытался использовать код из этой ссылки (поиск ориентации с помощью getRotationMatrix() и getOrientation()) для получения значений, но происходит сбой, а также я думаю, что это не те значения, которые мне нужны, потому что устройство остается неподвижным.

Иллюстрация того, что я имею в виду (у меня есть значение «H», и я ищу угол «a» или данные, из которых я могу его извлечь):

http://s2.postimg.org/z4mgu4l49/angle_A.jpg

Любые полезные ссылки, учебные пособия или образцы были бы очень полезны.


person Mindaugas    schedule 15.05.2013    source источник


Ответы (1)


Я предполагаю, что Android-устройство будет лежать вдоль гипотенузы треугольника, который вы нарисовали, так что если устройство лежало на столе, то ваш угол «а» был бы 90 градусов, а если устройство стоит вертикально тогда угол а будет равен нулю. Если это так, то этот угол «а» связан с шагом устройства, и это именно то, что вы должны получить, используя getRotationMatrix() и getOrientation(). Однако шаг обычно определяется как нулевой, когда устройство лежит горизонтально на столе, и 90 градусов, когда оно находится в вертикальном положении, поэтому ваш угол «а» равен (90 градусов — шаг). Остерегайтесь единиц, иногда углы в радианах, а иногда в градусах.

Если ваш код дает сбой, то вы, должно быть, где-то случайно добавили ошибку, потому что у меня определенно есть код, который использует getRotationMatrix() и getOrientation() без сбоев.

Вы обнаружите, что некоторые значения ориентации, созданные функцией getOrientation(), становятся ошибочными, когда устройство приближается к вертикальному положению. Это проблема, известная как Gimbal lock, потому что, когда устройство расположено вертикально, азимут и ролл - это одно и то же. Тем не менее, шаг должен оставаться надежным.

Если вам когда-либо понадобится надежный азимут, а также шаг, когда устройство находится в вертикальном положении, вы можете взглянуть на мой ответ на вопрос "Компас Android, который может компенсировать наклон и наклон". В этом ответе есть код, который определенно работает, и если вы не можете заставить работать getRotationMatrix() и getOrientation(), то шаг, который получается из этого, вам подойдет.

person Stochastically    schedule 15.05.2013