Java 当设备不与地面平齐时查找方位角值-Android?

Java 当设备不与地面平齐时查找方位角值-Android?,java,android,android-sensors,android-orientation,device-orientation,Java,Android,Android Sensors,Android Orientation,Device Orientation,我想找到设备的方位角,当它不是平坦的地面 这里有一个已经存在但不完整的答案: mAzimuthAngleNotFlat = (int) Math.toDegrees(Math .atan2((rotationMatrix[1] - rotationMatrix[3]), (rotationMatrix[0] + rotationMatrix[4]))); if (mAzimuthAngleNotFlat < 0) { mAz

我想找到设备的方位角,当它不是平坦的地面

这里有一个已经存在但不完整的答案:

mAzimuthAngleNotFlat = (int) Math.toDegrees(Math
                    .atan2((rotationMatrix[1] - rotationMatrix[3]), (rotationMatrix[0] + rotationMatrix[4])));
    if (mAzimuthAngleNotFlat < 0) {
        mAzimuthAngleNotFlat += 360;
    }
这是关于这个问题的公认答案,几乎相同

问题:

mAzimuthAngleNotFlat = (int) Math.toDegrees(Math
                    .atan2((rotationMatrix[1] - rotationMatrix[3]), (rotationMatrix[0] + rotationMatrix[4])));
    if (mAzimuthAngleNotFlat < 0) {
        mAzimuthAngleNotFlat += 360;
    }
但在这个问题上,公认的答案给出的方位角值在-89到89之间。我想计算距离
0-359度
的方位角值,当从磁北移动时。在Android传感器中,我如何计算它呢?

找到了答案:

像这样计算方位角:

mAzimuthAngleNotFlat = (int) Math.toDegrees(Math
                    .atan2((rotationMatrix[1] - rotationMatrix[3]), (rotationMatrix[0] + rotationMatrix[4])));
    if (mAzimuthAngleNotFlat < 0) {
        mAzimuthAngleNotFlat += 360;
    }
要将其转换为0到359,只需应用以下命令:

mAzimuthAngleNotFlat = (int) Math.toDegrees(Math
                    .atan2((rotationMatrix[1] - rotationMatrix[3]), (rotationMatrix[0] + rotationMatrix[4])));
    if (mAzimuthAngleNotFlat < 0) {
        mAzimuthAngleNotFlat += 360;
    }
if(mAzimuthAngleNotFlat<0){
mAzimuthAngleNotFlat+=360;
}
那你就完了。当设备不平坦时,这个角度将是准确的。有关更多信息,请参阅关于已接受答案的讨论


当设备不平坦时,如果您希望您的指南针方向与设备z轴方向(即您正在查看的方向)相反,则可以通过第一次调用来计算方位角

remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);
然后打电话

getOrientation (float[] R, float[] values)
为参数
R
传入
outR

这相当于将z轴投影到世界xy平面,然后计算此投影与世界y轴(磁北)之间的角度


当设备围绕z轴旋转时,z轴指向同一方向,因此方位角不应改变。当然,它会因加速度而略有变化。

当设备不平坦时,您想做什么?你想得到什么方向?这算什么?我把它放在我的代码里,垂直握住手机,开始绕z轴旋转,mAzimuthAngleNotFlat值会发生剧烈变化。例如,最初的角度是260度,顺时针旋转90度,得到360度左右,当保持旋转时,该值保持基本不变,或者变为<90度,当手机倒置时,该值突然变为270度左右。如果一致,则应为90。如果值介于-89和89之间,如何通过添加360来获得91-269范围内的值?当设备不平坦时,它会计算方位角。方位角是什么?你感兴趣的关于磁北的方向是什么?这就是你想要的吗?用户甚至不能稍微旋转手机?你似乎不明白我在说什么,你应该看看我的答案,谢谢你的回答。在接受之前,让我实现并测试它;我将在方向矩阵的第0个索引处找到方位角。是吗?在任何情况下,在调用getOrientation后,方位角都是值[0]。感谢您的回复。
import static android.hardware.SensorManager.AXIS\X;导入静态android.hardware.SensorManager.axisz