我有一条定义为 A、B、C、D 的三次贝塞尔曲线。其中 A 是起点,B 和 C 是控制点,D 是终点。我了解如何在任何值 t 处找到位置,其中 0 <= t <= 1,以及该概念的一般性概念,因为它仅使用少量调用产生曲线的线性插值函数。 (可以很容易地可视化 here on wikipedia 就在标题高阶曲线的下方)
我现在正在寻找曲线上最接近空间中某个点的点,P。谷歌引导我进行了多次讨论,但没有一个能触发我大脑中的神经元“哦!”实际上,老实说,它们都飞过我的头顶。我的数学知识一定比我想要的要有限一些,而且一提到导数就崩溃了。
以下是 Google 引导我去的一些地方:
stackoverflow.com (close but I don't understand it)
其中包括我似乎无法再次挖掘的 ActionScript 实现,我知道我在附近某处的答案/评论中找到了它...
有没有人有知识和耐心帮助这些信息进入我的大脑?我正在考虑采用“足够接近”的方法并使用直线上最近的点,然后以非常小的步长迭代曲线。这会很慢,并且会丢失准确性。在我的特殊情况下,准确性不如速度那么重要,但是,我觉得有一种方法可以兼顾两者......
提前致谢。
最佳答案
正如cmaster所说,这导致五次多项式的解找到六次多项式的最小值
它是 2D 还是 3D 并不重要。最小化函数是六次多项式
f(t)=0.5*dot(p(t)-X,p(t)-X) such that 0<=t<=1
其中 X 是给定点,p(t) 是多项式曲线,点
表示欧氏标量积。
最小化可以通过找到导数的所有根来实现
f'(t)=dot(p'(t), p(t)-X)
在区间内比较根和区间端点的函数值。
也存在不使用导数的最小化方法,主要用于比多项式更复杂的函数。参见例如第 5 章
Brent, R. P. (1973), Algorithms for Minimization without Derivatives , Englewood Cliffs, NJ: Prentice-Hall, ISBN 0-13-022335-2
(这本书仍然包含关于导数和泰勒多项式的大量章节)。该方法或其主要思想也可以在“数值食谱”中找到,如 "golden section search" .
关于c++ - 三次贝塞尔曲线上到给定点的最近点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23858683/