点到指定Bezier曲线的最短距离

Bezier曲线本质上是一个多项式。
 
三次曲线Q:
Q ( u ) = ( 1 − u ) 3 P 0 + 3 ( 1 − u ) 2 u P 1 + 3 ( 1 − u ) u 2 P 2 + u 3 P 3 = n u 3 + r u 2 + s u + v \begin{aligned} Q(u) &= (1-u)^3P_0+3(1-u)^2uP_1+3(1-u)u^2P_2+u^3P_3\\ &=nu^3+ru^2+su+v \end{aligned} Q(u)​=(1−u)3P0​+3(1−u)2uP1​+3(1−u)u2P2​+u3P3​=nu3+ru2+su+v​

点P到曲线Q的距离D(u):
D ( u ) = ∣ Q ( u ) − P ∣ 2 = ( Q x − P x ) 2 + ( Q y − P y ) 2 + ( Q z − P z ) 2 ( 1 ) D(u)=|Q(u)-P|^2=(Q_x-P_x)^2+(Q_y-P_y)^2+(Q_z-P_z)^2 \quad (1) D(u)=∣Q(u)−P∣2=(Qx​−Px​)2+(Qy​−Py​)2+(Qz​−Pz​)2(1)
 
求最短距离,即最小值优化问题:
D 2 ( u ) m i n = m i n D 2 ( u ) 0 ≤ u ≤ 1 ( 2 ) D^2(u)_{min}=min{\quad D^2(u)} \quad 0\le u\le 1\quad(2) D2(u)min​=minD2(u)0≤u≤1(2)

二分区间法求解

算法流程:

1.分别计算点P到数据点Pi (i=0,1,2,3)的距离,取最小距离对应点位Pj
2.取Pj对应的节点ui为初始节点
3.选取合适的区间值 interval
4.根据式(1),计算节点 ui+interval,ui-interval,ui处的距离 d1,d2,d0
5.如果d1或者d2小于d0,将ui的值更改为ui+interval或ui-interval
6.如果d1、d2都大于d0,将区间interval减半为interval/2
7.重复以上步骤,直到d1 d2 d0之间的差值满足设置的精度

Python仿真结果

图中,

黑色点位为给定的点位P;

红色点位为曲线Q(u)上距离P最近的点Pmin;

黑色线为P到曲线Q的距离D(u);

红色线为拟合的Bezier曲线Q(u);

黑色点的y坐标不变,横坐标不断向右移动。由动图可见,计算得到的Pmin始终跟随D(u)的最小距离位置,

最短距离点计算成功!

牛顿迭代法求解

由数学知识可知,为求解式(2),即求解式(1)在区间[0,1]的极小值,此问题即转化为求极值问题。
 
式(1)的极值即出现在其导数值为0的点,其导数为:
D ′ ( u ) = 2 ( Q x − P x ) Q x ′ + 2 ( Q y − P y ) Q y ′ + 2 ( Q z − P z ) Q z ′ = 0 ( 3 ) f ( u ) = ( Q x − P x ) Q x ′ + ( Q y − P y ) Q y ′ + ( Q z − P z ) Q z ′ f ′ ( u ) = Q x ′ 2 + ( Q x − P x ) Q x ′ ′ + Q y ′ 2 + ( Q y − P y ) Q y ′ ′ + Q z ′ 2 + ( Q z − P z ) Q z ′ ′ D^{'}(u)=2(Q_x-P_x)Q^{'}_x+2(Q_y-P_y)Q^{'}_y+2(Q_z-P_z)Q^{'}_z=0 \quad (3)\\ f(u) = (Q_x-P_x)Q^{'}_x+(Q_y-P_y)Q^{'}_y+(Q_z-P_z)Q^{'}_z\\ f^{'}(u)=Q_x^{'2}+(Q_x-P_x)Q^{''}_x+Q_y^{'2}+(Q_y-P_y)Q^{''}_y+Q_z^{'2}+(Q_z-P_z)Q^{''}_z D′(u)=2(Qx​−Px​)Qx′​+2(Qy​−Py​)Qy′​+2(Qz​−Pz​)Qz′​=0(3)f(u)=(Qx​−Px​)Qx′​+(Qy​−Py​)Qy′​+(Qz​−Pz​)Qz′​f′(u)=Qx′2​+(Qx​−Px​)Qx′′​+Qy′2​+(Qy​−Py​)Qy′′​+Qz′2​+(Qz​−Pz​)Qz′′​
 
求解式子(3),可以使用牛顿迭代公式求解:
u k + 1 = u k − f ( u ) f ′ ( u ) ( 4 ) u_{k+1}=u_k-\frac{f(u)}{f^{'}(u)} \quad (4) uk+1​=uk​−f′(u)f(u)​(4)

牛顿迭代公式求解速度很快,但是对初值的选取比较敏感,如果初值选取的不好,有可能出现无解的情况。

二分区间法求解求解比较稳定,但是其速度比较慢。有一种思路是将二分区间法和牛顿迭代法结合,先计算一个粗略的初始值,再用二分区间法求解求解比较稳定,但是其速度比较慢。有一种思路是将二分区间法和牛顿迭代法结合,先计算一个粗略的初始值,再用牛顿迭代法求解,以加快算法速度。

点到指定Bezier曲线的最短距离相关推荐

  1. 计算机图形学E10——Bezier曲线

    其他计算机图形学实验见 链接 #include<gl/glut.h> #include<iostream> #include<algorithm> #include ...

  2. 【四足机器人--摆动相足端位置速度轨迹规划】(4.1)FootSwingTrajectory(bezier曲线计算脚的摆动轨迹)代码解析

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.FootSwingTrajectory(bezier曲线)的内容 ...

  3. C#绘制带控制点的Bezier曲线,用于点阵图像及矢量图形

    [摘要]不借助第三方, 使用c# + GDI+进行SVG等绘图,绘制带控制点的Bezier曲线.可用于点阵图像及矢量图形(如SVG)绘图.先看效果: (不知为何,已两次上传图片,无法显示,求助csdn ...

  4. 计算机图形学:Bezier曲线的绘制

    1.实验目的 掌握Bezier曲线的定义原理及绘制过程 定义: 贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.一般的矢量图形软件通过它来精确画出 ...

  5. java画bezier曲线,解析在Direct2D中画Bezier曲线的实现方法

    Direct2D通过因此,想要使用Direct2D绘制一段通过指定点的曲线,比如Bezier曲线,必须借助于C#的代码可以很容易的转换成C++版本的,下面是我转换的一个用于Direct2D的绘制Bez ...

  6. 曲线数学NURBS之bezier曲线

    最近新研究topic是NURBS,NURBS(Non Uniform Rational B-spline)即非均匀有理B样条曲线.往往提到B样条.以及NURBS就会提到bezier曲线,他们之间的关系 ...

  7. bezier曲线_Bezier算法

    个人博客: vectormoon's blog​www.vectormoon.net bezier算法的背景 vm公司设计出了一个原型车--moon,这样的: 产品经理一看觉得有点抽象,他使用了Bez ...

  8. [摘抄] Bezier曲线、B样条和NURBS

    Bezier曲线.B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是: Bezier曲 ...

  9. Hermite曲线与Bezier曲线的关系

    结论 最近在研究3次样条曲线.曲线由四个控制点控制,依次记为P0,P1,P2,P3.在绘制Hermite曲线的时候,发现如果令P0处的导数为3倍P1-P0,P3处的导数为3倍P3-P2,则P0,P1, ...

最新文章

  1. python重复执行_python flask schedule重复运行 任务被重复执行问题 解决方案
  2. C#复制、粘贴文本信息到剪贴板
  3. 返回指定大小的数组_python中数组和矩阵的基础以及应用
  4. 【Python小脚本】实现王者农药自动刷金币啦~啦啦啦走跟我一起组队~
  5. 海洋zyapi.php,海洋cms自带资源发布api插件和第三方资源站接入办法说明
  6. cvCalcEMD2() 直方图匹配
  7. [C]我使用蜂鸣器敲了一首《极乐净土》
  8. python考试报名官网安徽_2019年3月安徽宿州学院全国计算机等级考试报名通知
  9. 转载双显示器显示模式介绍
  10. java计算机毕业设计共享充电宝管理系统源码+mysql数据库+系统+lw文档+部署
  11. 苹果手机10秒解除锁屏_苹果密码忘了不想刷机怎么办_苹果手机10秒解除锁屏
  12. Redis学习笔记1-理论篇
  13. 什么是Virtual Dom
  14. 2021年数维杯数学建模A题外卖骑手的送餐危机求解全过程文档及程序
  15. java 服务器 http请求_Java网络编程——发送HTTP请求到服务器
  16. 【阿里云IoT+YF3300】15.阿里云物联网小程序构建
  17. 毕业论文的研究背景怎么写?
  18. 6个实用的红米手机技巧
  19. windows bat
  20. 免费的思维导图软件哪个好?这篇文章告诉你

热门文章

  1. python怎么输出1到100的数字集合_python 如何将一系列数字十个一行输出
  2. 写给现在我所在小团队的话
  3. 武侠之鸿蒙升级系统,刚到鸿蒙的我被武侠系统绑定了
  4. 是谁,在敲打我窗-CSS雨滴动画效果
  5. Worthington木瓜蛋白酶化学性质和特异性
  6. 武汉苹果iPhone6Plus特价3980分期0首付
  7. 中国智能消防机器人市场需求分析与前景动态研究报告2022-2028年
  8. 【精品】SpringSecurity在前后端分离项目中的应用
  9. 使用顺序表、单链表求集合运算
  10. 独家专访克新任未婚总检察长:美丽挽救世界