【问题标题】:How to convert radians into full 360 degrees format?如何将弧度转换为完整的 360 度格式?
【发布时间】:2022-11-16 17:04:01
【问题描述】:

我正在尝试使用加速度计+磁力计值在我的地图上绘制方位线。所以我正在使用谷歌示例。这是我得到的:

private val sensorManager by lazy { context.getSystemService(Context.SENSOR_SERVICE) as SensorManager }

    private val lastAccelerometerReading = FloatArray(3)
    private val latMagnetometerReading = FloatArray(3)

    private val rotationMatrix = FloatArray(9)
    private val orientationAngles = FloatArray(3)

    private var lastAccelerometerSet = false
    private var lastMagnetometerSet = false

    override fun onSensorChanged(event: SensorEvent) {
        if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
            System.arraycopy(event.values, 0, lastAccelerometerReading, 0, lastAccelerometerReading.size)
            lastAccelerometerSet = true
        } else if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
            System.arraycopy(event.values, 0, latMagnetometerReading, 0, latMagnetometerReading.size)
            lastMagnetometerSet = true
        }
        if (lastAccelerometerSet && lastMagnetometerSet) updateOrientationAngles()



        Timber.d("!!! orientation = ${
            orientationAngles[0] * (180 / Math.PI)
        }")
    }

    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) = Unit

    fun registerDeviceOrientationListener() {
        sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)?.also { accelerometer ->
            sensorManager.registerListener(
                this,
                accelerometer,
                SensorManager.SENSOR_DELAY_NORMAL,
                SensorManager.SENSOR_DELAY_UI
            )
        }
        sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)?.also { magneticField ->
            sensorManager.registerListener(
                this,
                magneticField,
                SensorManager.SENSOR_DELAY_NORMAL,
                SensorManager.SENSOR_DELAY_UI
            )
        }
    }

    fun unregisterDeviceOrientationListener() {
        sensorManager.unregisterListener(this)
    }

    private fun updateOrientationAngles() {
        SensorManager.getRotationMatrix(
            rotationMatrix,
            null,
            lastAccelerometerReading,
            latMagnetometerReading
        )
        SensorManager.getOrientation(rotationMatrix, orientationAngles)
    }

它工作正常,但我有一个问题。当我将方向从弧度转换为度数格式时,我得到了 (-180; 180) 格式的值。但我需要它是 (0; 360) 格式才能让我的地图正常工作。 那么我怎样才能把它变成 (0; 360) 格式呢?现在北方为 0,东北-南方向为 180,西北-南方向为 0 到 -180。我需要它在北方为 0,在西北-南方方向为 180,在东南-北方方向为 180 到 360,就像 Google 的 Fused 位置中的 bearing

【问题讨论】:

    标签: android kotlin accelerometer magnetometer


    【解决方案1】:

    公式是: 度数 = 弧度 X 180/Pi

    【讨论】:

      【解决方案2】:

      将 (-180; 180) 标准化为 (0; 360):

      (degrees + 360) % 360
      

      其中 % 是模运算符。

      【讨论】:

        猜你喜欢
        • 2015-11-28
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 2013-10-15
        • 1970-01-01
        相关资源
        最近更新 更多