假设轨道足够小,我们可以假设这些点位于平面上,例如,我们可以忽略地球的曲率。在这种情况下,您可以将所有点转换为平面中的点,例如,P(i) = (x(i), y(i)) 没有 z 坐标。
考虑以下算法: 找到位于轨道中间某处的点 C = (Cx, Cy),例如,所有点的质心。确切的位置并不重要。然后想象一个观察者站在 C 点并且总是旋转以面向车辆。您想计算观察者在车辆行驶时旋转的次数。
为此,您需要能够找到当车辆在点列表中的两个相邻点 P(i) 和 P(i+1) 之间行驶时观察者将旋转的带符号角。这与找到向量 P(i) - C 和 P(i+1) - C 之间的有符号角相同,这可以使用叉积来完成。这特别容易,因为我们有二维点。我们有
P = (x(i) - Cx) * (y(i+1) - Cy) + (x(i+1) - Cx) * (y(i) - Cy)
如果 P 为正,则观察者逆时针旋转,如果为负,则观察者顺时针旋转。观察者旋转的角度是
theta(i, i+1) = arcsin( P / (length(x(i) - C) * length(x(i+1) - C)))
其中 theta(i, i+1) 是正还是负,取决于观察者旋转的方向。
在这里,我们使用相邻点靠得很近,这样观察者就可以在相邻点之间旋转一个小于 pi/2 的小角度。
要找到观察者旋转的总量,只需对从路径开始到结束的所有 theta 求和,确保保留 theta 的符号,以防车辆因某种原因向后移动。假设 theta 以弧度为单位,则电路总数就是 theta 之和除以 2 * pi。
对于真正的极客来说,这只是使用定义计算车辆围绕 C 的路径的绕数。