如何计算当前方向和GPS点之间的角度
How to calculate angle beetween current direction and GPS point
我有 2 个点(Android 位置对象):当前位置和目标位置。我还有设备的方向(以度为单位)。
我想计算目标位置和方向之间的角度。如何正确操作?
我从 FusedLocationProvider 接收位置信息(如果重要的话)。
现在我只用
float requiredAngle = Math.abs(location.getBearing() - 180 - target.bearingTo(location));
float angleBetween = Math.abs(requiredAngle - location.getBearing());
这是 returns 不正确的角度。
我想我应该计算真北和磁北之间的差异并添加设备方向。然后使用 currentPosition.bearingTo(target),并从轴承中减去设备方向。
那你可以看看这篇文章:https://onlinemschool.com/math/library/vector/angl/
- 计算向量的点积
- 计算向量大小
- 计算这两个向量之间的角度
矢量 A 和矢量 B 之间的夹角公式:
余弦 (alpha) = dotProductAB / (magnitudeA * magnitudeB)
这个角度叫做相对方位角。
注册 Sensor.TYPE_ROTATION_VECTOR、Sensor.TYPE_ACCELEROMETER、Sensor.TYPE_MAGNETIC_FIELD 的听众。
喜欢:
sensorManager.registerListener(listener, sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), SensorManager.SENSOR_DELAY_NORMAL);
然后为此创建一个监听器:
private float[] gravity;
private float[] geomagnetic;
private float[] R = new float[9];
private float[] I = new float[9];
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
gravity = sensor.values(); // Just save the values
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
geomagnetic = sensor.values();
}
if (SensorManager.getRotationMatrix(R, I, gravity, geomagnetic)) { // If something is wrong (like device is in free fall)
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
// Now you have values from -PI to PI
float heading;
if (R[0] > 0) { // R[0] is heading
heading = R[0] * 180 / PI;
} else { // -PI, eq. from South to West to North
heading = (Math.abs(R[0]) * 180 / PI) * 2;
}
float relativeBearing = location.bearingTo(target) - heading;
if (relativeBearing < 0) {
relativeBearing = 360 + relativeBearing;
}
}
}
文档:
https://developer.android.com/reference/android/hardware/SensorManager#getRotationMatrix(float[],%20float[],%20float[],%20float[])
https://developer.android.com/reference/android/hardware/SensorManager#getOrientation(float[],%20float[])
我有 2 个点(Android 位置对象):当前位置和目标位置。我还有设备的方向(以度为单位)。
我想计算目标位置和方向之间的角度。如何正确操作?
我从 FusedLocationProvider 接收位置信息(如果重要的话)。 现在我只用
float requiredAngle = Math.abs(location.getBearing() - 180 - target.bearingTo(location));
float angleBetween = Math.abs(requiredAngle - location.getBearing());
这是 returns 不正确的角度。
我想我应该计算真北和磁北之间的差异并添加设备方向。然后使用 currentPosition.bearingTo(target),并从轴承中减去设备方向。
那你可以看看这篇文章:https://onlinemschool.com/math/library/vector/angl/
- 计算向量的点积
- 计算向量大小
- 计算这两个向量之间的角度
矢量 A 和矢量 B 之间的夹角公式: 余弦 (alpha) = dotProductAB / (magnitudeA * magnitudeB)
这个角度叫做相对方位角。
注册 Sensor.TYPE_ROTATION_VECTOR、Sensor.TYPE_ACCELEROMETER、Sensor.TYPE_MAGNETIC_FIELD 的听众。 喜欢:
sensorManager.registerListener(listener, sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR), SensorManager.SENSOR_DELAY_NORMAL);
然后为此创建一个监听器:
private float[] gravity;
private float[] geomagnetic;
private float[] R = new float[9];
private float[] I = new float[9];
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
gravity = sensor.values(); // Just save the values
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
geomagnetic = sensor.values();
}
if (SensorManager.getRotationMatrix(R, I, gravity, geomagnetic)) { // If something is wrong (like device is in free fall)
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
// Now you have values from -PI to PI
float heading;
if (R[0] > 0) { // R[0] is heading
heading = R[0] * 180 / PI;
} else { // -PI, eq. from South to West to North
heading = (Math.abs(R[0]) * 180 / PI) * 2;
}
float relativeBearing = location.bearingTo(target) - heading;
if (relativeBearing < 0) {
relativeBearing = 360 + relativeBearing;
}
}
}
文档: https://developer.android.com/reference/android/hardware/SensorManager#getRotationMatrix(float[],%20float[],%20float[],%20float[]) https://developer.android.com/reference/android/hardware/SensorManager#getOrientation(float[],%20float[])