c++ - 三次贝塞尔曲线上到给定点的最近点

标签 c++ math curve bezier

我有一条定义为 A、B、C、D 的三次贝塞尔曲线。其中 A 是起点,B 和 C 是控制点,D 是终点。我了解如何在任何值 t 处找到位置,其中 0 <= t <= 1,以及该概念的一般性概念,因为它仅使用少量调用产生曲线的线性插值函数。 (可以很容易地可视化 here on wikipedia 就在标题高阶曲线的下方)

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

以下是 Google 引导我去的一些地方:

gamedev.net

stackoverflow.com (quadratic)

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/

相关文章:

c++ - 如何提取两个括号之间的字符串?

python:如何在两个 3d 点之间绘制曲线?

r - 将曲线添加到 R 中的散点图

C++ 模板友元运算符重载

c++ - CMAKE:自动添加依赖项的依赖

math - 射影平面理论在现实生活中的应用

ios - 用于在多个单位之间转换值的动态数学

python - 使用python求解三角非线性方程: what am I doing wrong?

excel - 如何将Excel中的数据曲线拟合为多变量多项式?

c++ - 线程安全无锁数组