9

次の方法を使用して、コンパスの方位を度(0〜360)で取得しようとしています。

float[] mGravity;
float[] mGeomagnetic;
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
        mGravity = event.values;
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
        mGeomagnetic = event.values;
    if (mGravity != null && mGeomagnetic != null) {
        float R[] = new float[9];
        float I[] = new float[9];
        boolean success = SensorManager.getRotationMatrix(R, I, mGravity,
                mGeomagnetic);
        if (success) {
            float orientation[] = new float[3];
            SensorManager.getOrientation(R, orientation);
            float azimut = orientation[0];
            bearing.setText("Bearing: "+ azimut);
        }
    }
}

方位角の値(つまりorientation[0])は0 <=方位角<360である必要がありますが、デバイスを回転させたときに-3から3までの値しか取得できません。誰かが問題が何であるか教えてもらえますか?

4

3 に答える 3

12

値はラジアンです。円弧の角度に変換する必要があります

int azimut = (int) Math.round(Math.toDegrees(orientation[0]));
于 2013-03-01T11:42:23.217 に答える
7

ラジアンであることは事実です。ありがとうホアン。方位を 0 から 360 の範囲で取得するためのロジックを追加しました。これは、度に変換しただけでは、-180 から 180 の値を取得していたためです。

float azimuthInRadians = orientation[0];
float azimuthInDegress = (float)Math.toDegrees(azimuthInRadians)+360)%360;
于 2013-03-01T12:54:10.883 に答える