我需要找到以度为单位测量的车辆转弯角度。
位置点以相等间隔(1秒)更新。因此装置在转弯时会产生4-5分。我在图片上示意地显示了这一点。
是否可以使用位置计算转弯角度?如果可能,怎么做?
我尝试了什么:
Vector1 (lat2 - lat1; lon2 - lon2)
。不确定这种方法是否可以应用于位置坐标。location1.bearingTo(location2)
。但这并没有给出预期的结果。好像它给了"指南针"结果。 Perhabs我可以用某种方式但不确定。 编辑:解决方案
接受的答案很有效。但要完成答案,我必须展示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点之间的角度差,以获得更好的结果。
希望它对某人有所帮助!
答案 0 :(得分:2)
vect1 = LatLon2 - LatLon1; // vector subtraction
vect2 = LatLon4 - LatLon3;
根据dot产品的定义具有以下属性:
vect1.vect2 = ||vect1||*||vect2||*Cos(theta)
术语vect1.vect2
是vect1
和vect2
的点积。
点积的一般形式可以按组件分解为v1 = <x1,y1>
和v2=<x2,y2>
两个任意向量v1
和v2
点积为:< / p>
v1.v2 = x1*x2 + y1*y2
并且某个任意向量v
的大小为:
||v|| = sqrt(v.v); which is a scalar.
以上等同于具有分量x和y的欧几里德距离公式:
||v|| = sqrt(x^2 + y^2)
根据两个向量theta
和vect1
找到vect2
的值:
theta = Math.ArcCos(vect1.vect2/(||vect1||*||vect2||))
答案 1 :(得分:1)
方法1不能像你描述的那样工作:Lat,Lon不是笛卡尔坐标(以米为单位表示的一度经度不是一度的latitide,这仅在赤道上有效)。您将首先转换为(本地)笛卡儿系统。
图中有错误:标有“?”的角度放在错误的一边。你最想要的角度:180 - ? 在你的例子中,汽车转动不到90°,尽管你的角度超过90°。 为了更好地理解另一个绘图,汽车只向左转10度。在你的绘图中,这将是170°,这是错误的。
方法2)效果更好,但需要总结角度差异。 你必须自己写一个方法
double angleDifference(double angle1, double angle2);
这看起来比它容易,虽然代码只有几行。 确保您有一些测试用例在超过360°限制时测试行为。 实施例
(从轴承10转到轴承350),应该给20或-20,这取决于你是否希望该方法给出绝对值或相对角度