三次贝塞尔曲线上离给定点最近的点

Nearest point on cubic bezier curve to a given point

本文关键字:最近 曲线 三次      更新时间:2023-10-16

我有一条三次贝塞尔曲线,定义为a, B, C, D,其中a为起点,B和C为控制点,D为终点。我理解如何在任意值t处找到位置,其中0 <= t <= 1,以及一般的概念,因为它只是使用对线性插值函数的少量调用来生成曲线。(在维基百科高阶曲线标题下可以很容易地看到)

我现在正在寻找曲线上最接近空间中某个点p的点。谷歌让我进行了多次讨论,但没有一次能触发我大脑中的神经元发出"哦!"事实上,老实说,他们都飞过我的头顶。我的数学知识一定比我想的要有限一些,一提到导数,我的数学知识就崩溃了。

以下是谷歌引领我的一些地方:

gamedev.net

stackoverflow.com(二次)

stackoverflow.com(接近但我不明白)

在其他包括ActionScript中的实现,我似乎无法再挖掘,我知道我在这里的某个地方找到了它的答案/评论…

有没有人有知识和耐心来帮助这些信息进入我的大脑?我正在考虑采用"足够接近"的方法,使用直线上最近的点,然后以非常小的步骤在曲线上迭代。这将是缓慢的,并将失去准确性。在我的特殊情况下,准确性比速度更重要,然而,我觉得有一种方法可以同时拥有两者。

正如cmaster所说,这将导致求解五次多项式以找到六次多项式的最小值

是2D还是3D并不重要。要最小化的函数是六次多项式

f(t)=0.5*dot(p(t)-X,p(t)-X) such that 0<=t<=1

式中,X为给定点,p(t)为多项式曲线,dot为欧氏标量积。最小化可以通过找到导数

的所有根来实现。
f'(t)=dot(p'(t), p(t)-X)

区间内,比较区间根和区间端点的函数值。

也存在不使用导数的最小化方法,主要用于比多项式更复杂的函数。参见

第5章

Brent, R. p .(1973),无导数的最小化算法,Englewood Cliffs, NJ: Prentice-Hall, ISBN 0-13-022335-2

(这本书包含了大量关于导数和泰勒多项式的章节)。该方法或其主要思想也可在"数值菜谱"中找到,即"黄金分割搜索"。