我有一个包含大量点数的GPX文件(经度和纬度按时间排序),如何计算我的集合包含的圈数?
在赛道会议期间记录GPS。
圈数是车辆通过赛道开始/结束的次数。
答案 0 :(得分:4)
假设轨道足够小,我们可以假设这些点位于平面上,例如,我们可以忽略地球的曲率。在这种情况下,您可以将所有点转换为平面中的点,例如P(i)=(x(i),y(i))而不使用z坐标。
考虑以下算法:找到位于轨道中间某处的点C =(Cx,Cy),例如所有点的质心。确切的位置无关紧要。然后想象观察者站在C点并始终旋转以面向车辆。您想要计算观察者在车辆行驶时旋转的次数。
为此,您需要能够找到当车辆在点列表中的两个相邻点P(i)和P(i + 1)之间行进时观察者将旋转的带符号角度。这与找到矢量P(i)-C和P(i + 1)-C之间的有符号角度相同,这可以使用cross product来完成。这很容易,因为我们有二维点。我们有
P =(x(i)-Cx)*(y(i + 1)-Cy)+ (x(i + 1) - Cx)*(y(i)-Cy)
如果P为正,则观察者逆时针旋转,如果为负,则观察者顺时针旋转。观察者旋转的角度是
theta(i,i + 1)= arcsin(P / (长度(x(i) - C)*长度(x(i + 1) - C)))
其中theta(i,i + 1)为正或负,取决于观察者旋转的方向。
这里我们使用相邻的点靠近在一起,这样观察者只需在相邻点之间旋转小于pi / 2的小角度。
要查找观察者旋转的总量,只需将路径的开头到结尾的所有tt求和,确保在车辆因某种原因向后移动的情况下保留theta的符号。假设theta是弧度,电路总数只是thetas除以2 * pi的总和。
对于真正令人讨厌的人来说,这只是使用定义来计算C周围车辆路径的winding number。
答案 1 :(得分:2)
解决方案需要一些试验和错误才能看到有效的方法,因为它很大程度上取决于数据质量和数据点数。
如果数据点的频率很高,那么使用line-line intersection测试可能就足够了。如果由两个相邻数据点形成的线与赛道上的终点线相交,那么您可以将其计为一圈。但是,当数据点相距太远时,这将失败。如果汽车在终点线离开赛道,它也可能失败,除非你小心你的解决方案。
更通用的解决方案是将轨道分成两个多边形:每个多边形代表轨道的一半。使他们的报道包括偏离轨道。然后使用point in polygon测试来确定哪些数据点位于轨道的哪一半。然后迭代点并注意汽车何时从一半移动到另一半。每一次过渡应指示一圈。然而,如果汽车旋转失控并在两半之间摆动而不绕整圈进行,则会失败。
您可以通过在转换之间强制执行最少数量的数据点来解决此问题。另一个想法是将赛道分成三个多边形并确保赛车始终“前进”。