【问题标题】:Find the closest point on a curve to a given point找到曲线上离给定点最近的点
【发布时间】:2015-08-18 03:40:12
【问题描述】:

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

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

我正在做一些研究,对曲线插值了解不多,欢迎提出建议。

【问题讨论】:

标签: geometry interpolation


【解决方案1】:

为了从记录点计算轨迹,我建议使用向心或弦长 Catmull-Rom 样条。有关详细信息,请参阅link。 Catmll-Rom 样条实际上是特殊的三次 Hermite 曲线,可以很容易地转换为三次 Bezier 曲线。请注意,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2018-08-28
    • 2021-12-24
    • 1970-01-01
    • 2021-08-06
    • 2011-05-20
    • 2020-12-24
    相关资源
    最近更新 更多