使用位置查找运动转角
Find movement turn angle using Location
我需要找到以度为单位的车辆转弯角度。
位置点以等间隔(1 秒)更新。因此,设备在转弯时获得 4-5 分。我在图片上示意性地展示了它。
是否可以使用位置计算转角?如果可以,如何计算?
我尝试了什么:
- 分别从点 3、4 和点 1、2 创建两个几何向量,并求出这些向量之间的角度。我计算的向量坐标
Vector1 (lat2 - lat1; lon2 - lon2)
。不确定这种方法是否适用于位置坐标。
- 使用
location1.bearingTo(location2)
。但这并没有给出预期的结果。似乎它给出了 "compass" 结果。也许我可以以某种方式使用它但不确定。
- 还尝试了一些三角函数公式,如 here or here or here。他们没有给出预期的角度。
编辑:解决方案
接受的答案效果很好。但要完成答案,我必须展示 angleDifference
的方法。这个对我有用:
public int getAngleDifference(int currentAngle){
int r = 0;
angleList.add(currentAngle);
if (angleList.size() == 4) {
int d = Math.abs(angleList.get(0) - angleList.get(3)) % 360;
r = d > 180 ? 360 - d : d;
angleList.clear();
}
return r;
}
我在列表中添加点直到有 4 个点,然后计算第 1 个点和第 4 个点之间的角度差以获得更好的结果。
希望对大家有所帮助!
方法 1 并不像您描述的那样工作:纬度、经度不是笛卡尔坐标(以米表示的经度不是纬度的度数,这仅在赤道处有效)。您必须首先转换为(本地)笛卡尔系统。
绘图中有错误:标有“?”的角度被放在错误的一边。您很可能想要 angle: 180 - ?
在您的示例中,汽车转弯小于 90°,但您的角度显示大于 90°。
为了更好地理解,再画一张汽车只左转 10 度的图。在您的绘图中,这将是 170°,这是错误的。
方法 2) 效果更好,但您需要总结角度差异。
你得自己写一个方法
double angleDifference(double angle1, double angle2);
虽然代码只有几行,但看起来比实际更容易。
确保您有一些测试用例来测试超过 360° 限制时的行为。
例子
(从方位角 10 转向方位角 350),应该给出 20 或 -20,具体取决于您是否希望该方法给出绝对值或相对角度
vect1 = LatLon2 - LatLon1; // vector subtraction
vect2 = LatLon4 - LatLon3;
根据点积的定义,有 属性:
vect1.vect2 = ||vect1||*||vect2||*Cos(theta)
这是符号的细分
项 vect1.vect2
是 vect1
和 vect2
的点积。
点积的一般形式可以按分量分解让 v1 = <x1,y1>
和 v2=<x2,y2>
对于两个任意向量 v1
和 v2
点积将是:
v1.v2 = x1*x2 + y1*y2
并且某个任意向量的大小 v
是:
||v|| = sqrt(v.v); which is a scalar.
以上等价于欧几里德距离公式,分量为x和y:
||v|| = sqrt(x^2 + y^2)
获取角度
给定两个向量 vect1
和 vect2
求 theta
的值:
theta = Math.ArcCos(vect1.vect2/(||vect1||*||vect2||))
我需要找到以度为单位的车辆转弯角度。
位置点以等间隔(1 秒)更新。因此,设备在转弯时获得 4-5 分。我在图片上示意性地展示了它。
是否可以使用位置计算转角?如果可以,如何计算?
我尝试了什么:
- 分别从点 3、4 和点 1、2 创建两个几何向量,并求出这些向量之间的角度。我计算的向量坐标
Vector1 (lat2 - lat1; lon2 - lon2)
。不确定这种方法是否适用于位置坐标。 - 使用
location1.bearingTo(location2)
。但这并没有给出预期的结果。似乎它给出了 "compass" 结果。也许我可以以某种方式使用它但不确定。 - 还尝试了一些三角函数公式,如 here or here or here。他们没有给出预期的角度。
编辑:解决方案
接受的答案效果很好。但要完成答案,我必须展示 angleDifference
的方法。这个对我有用:
public int getAngleDifference(int currentAngle){
int r = 0;
angleList.add(currentAngle);
if (angleList.size() == 4) {
int d = Math.abs(angleList.get(0) - angleList.get(3)) % 360;
r = d > 180 ? 360 - d : d;
angleList.clear();
}
return r;
}
我在列表中添加点直到有 4 个点,然后计算第 1 个点和第 4 个点之间的角度差以获得更好的结果。
希望对大家有所帮助!
方法 1 并不像您描述的那样工作:纬度、经度不是笛卡尔坐标(以米表示的经度不是纬度的度数,这仅在赤道处有效)。您必须首先转换为(本地)笛卡尔系统。
绘图中有错误:标有“?”的角度被放在错误的一边。您很可能想要 angle: 180 - ? 在您的示例中,汽车转弯小于 90°,但您的角度显示大于 90°。 为了更好地理解,再画一张汽车只左转 10 度的图。在您的绘图中,这将是 170°,这是错误的。
方法 2) 效果更好,但您需要总结角度差异。 你得自己写一个方法
double angleDifference(double angle1, double angle2);
虽然代码只有几行,但看起来比实际更容易。 确保您有一些测试用例来测试超过 360° 限制时的行为。 例子
(从方位角 10 转向方位角 350),应该给出 20 或 -20,具体取决于您是否希望该方法给出绝对值或相对角度
vect1 = LatLon2 - LatLon1; // vector subtraction
vect2 = LatLon4 - LatLon3;
根据点积的定义,有 属性:
vect1.vect2 = ||vect1||*||vect2||*Cos(theta)
这是符号的细分
项 vect1.vect2
是 vect1
和 vect2
的点积。
点积的一般形式可以按分量分解让 v1 = <x1,y1>
和 v2=<x2,y2>
对于两个任意向量 v1
和 v2
点积将是:
v1.v2 = x1*x2 + y1*y2
并且某个任意向量的大小 v
是:
||v|| = sqrt(v.v); which is a scalar.
以上等价于欧几里德距离公式,分量为x和y:
||v|| = sqrt(x^2 + y^2)
获取角度
给定两个向量 vect1
和 vect2
求 theta
的值:
theta = Math.ArcCos(vect1.vect2/(||vect1||*||vect2||))