三次贝塞尔曲线上离给定点最近的点
Nearest point on cubic bezier curve to a given point
我有一条三次贝塞尔曲线,定义为a, B, C, D,其中a为起点,B和C为控制点,D为终点。我理解如何在任意值t处找到位置,其中0 <= t <= 1,以及一般的概念,因为它只是使用对线性插值函数的少量调用来生成曲线。(在维基百科高阶曲线标题下可以很容易地看到)
我现在正在寻找曲线上最接近空间中某个点p的点。谷歌让我进行了多次讨论,但没有一次能触发我大脑中的神经元发出"哦!"事实上,老实说,他们都飞过我的头顶。我的数学知识一定比我想的要有限一些,一提到导数,我的数学知识就崩溃了。
以下是谷歌引领我的一些地方:
gamedev.netstackoverflow.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
(这本书包含了大量关于导数和泰勒多项式的章节)。该方法或其主要思想也可在"数值菜谱"中找到,即"黄金分割搜索"。
- 查找最近配对时的OpenMP竞赛条件
- 如何获取pcl迭代最近点(ICP)的迭代点数?
- CGAL:如何创建填充边界曲线的曲面网格?
- 如何找到给定点的最近平方
- 将前向声明的结构替换为最近定义的结构
- 使用 SFML 绘制曲线会给出错误的形状
- 使用 GSL 库制作样条曲线并使用它们进行集成
- 应该如何编写用于计算最近点距离的C++函数?
- 最近的邻居用nanoflann搜索
- GCC:--静态链接到pthread的整个存档配方在最近的GCC版本中停止工作
- 向下四舍五入到五个c++的最近倍数
- 扩充矩阵的行缩减-三维样条曲线计算
- 向心Catmull-Rom样条曲线插值alpha参数
- 在 3D 点云、GPU 中查找最近的邻居
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 使用 C++ 在 Qt5 中显示曲线
- 在RHEL6上使用最近的gcc进行编译:如何分发软件?
- 最近最少使用的 (LRU) 缓存
- 我最近正在阅读opencv源代码。有没有更好的方法来在opencv库中查找类定义?
- 三次贝塞尔曲线上离给定点最近的点