找到曲线上最接近给定点的点

Find the closest point on a curve to a given point

这条曲线其实就是一辆公交车的轨迹,曲线是由曲线上许多(最多几千个)离散的点表示的(这些点是由安装在公交车上的GPS设备记录的)。 输入一个点P,我需要在曲线上找到离P点最近的点。P点通常距离公交车的轨迹不超过30m。请注意,最近的点不一定是GPS设备记录的点,它可以是两个记录点之间的某个点。

首先我需要一个算法来从那些记录的点恢复轨迹。如果插值曲线可以显示公共汽车的急转弯,那就太好了。哪条曲线最适合这样的任务?贝塞尔曲线够好吗?最后我必须计算曲线上的最近点,当然算法完全取决于所选曲线的种类。

我正在研究,对曲线插值的了解不多,欢迎大家提出建议。

为了从记录点计算轨迹,我建议使用向心或弦长 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