曲线实际上是总线的轨迹,曲线由曲线上的许多(最多几千个)离散点表示(点由安装在总线上的GPS设备记录)。 输入一个点P,我需要找到曲线上最接近点P的点。点P通常距离总线的轨迹不超过30米。注意,最近的点不是GPS设备记录的点所必需的,它可以是两个记录点之间的某个点。
首先,我需要一种算法来从这些记录点恢复轨迹。如果插值曲线可以显示由总线产生的急转弯,那将是很好的。哪条曲线最适合这样的任务? Bezier曲线是否足够好?最后我必须计算曲线上的最近点,当然算法完全取决于所选曲线的类型。
我正在做一些研究,并且对曲线插值知之甚少,所以欢迎任何建议。
答案 0 :(得分:2)
为了计算记录点的轨迹,我建议使用向心或弦长Catmull-Rom样条。有关详细信息,请参阅link。 Catmll-Rom样条实际上是特殊的立方Hermite曲线,可以很容易地转换成三次贝塞尔曲线。请注意,Catmull-Rom样条曲线的结果仅为G1曲线。如果您希望轨迹具有更高的连续性(例如C2),则可以使用自然三次样条或一般B样条插值。无论你采取什么方法,建议保持样条度不高于5.度3是一个受欢迎的选择。
获得轨迹的数学表示后,您可以计算给定点P与轨迹之间的最小距离。通常,点P与曲线C(t)之间的平方距离表示为D(t)= | P-C(t)| ^ 2。 D的最小值将在其一阶导数为零的位置发生,这意味着我们必须找到以下等式的根:
dD / dt = 2 *(P-C(t))。C'(t)= 0
当C(t)为3度时,dD / dt为5度。这就是为什么建议先使用低度曲线的原因。
有许多文献或在线资料讨论如何有效和稳健地找到多项式(任何程度)的根。这是另一个可能有用的SO post。