转载自:https://www.cnblogs.com/flytrace/p/8413255.html

文章目录

  • 1.根据长度求坐标思路
  • 2.用数值积分实现s的积分
  • 3.牛顿迭代求解s对应的t
  • 4.直接推导二阶贝塞尔曲线的长度积分解析式

前几天在做摄像机轨道时,解决匀速定长运动问题,刚好理解了题述问题。

首先做完这个曲线上匀速运动的编程实现后,是十分愉悦的。这个问题里,两个科学史上的伟人,牛顿和高斯,相继大显身手,怎能不让人膜拜?我之前并不了解所涉及的数值分析方法,所以觉得很神奇。

以下为简洁我会使用向量的表示方法,使用大写数字代表向量。以catmullrom样条曲线(spline)为例,对于一个关于t的多次样条曲线:

Q(t)=At3+Bt2+Ct+DQ(t) = At^{3} + Bt^{2} + Ct + D Q(t)=At3+Bt2+Ct+D

1.根据长度求坐标思路

一般来说实际中,ttt的范围都是[0, 1]。当ttt在[0, 1]中滑动时,Q(t)Q(t)Q(t)的集合即为一条平滑曲线。注意到当ttt以匀速移动时,Q(t)Q(t)Q(t)在沿曲线方向上并不是匀速移动。要做到这一点,显然曲线长度sss是需要考虑的。假设在ttt点处我们有曲线长度,(根据sss长度,计算控制量ttt,再计算坐标Q(t)Q(t)Q(t))。
s=L(t)s = L(t) s=L(t)
那么s长度所对应的t即为上面方程的反函数:
t=L−1(s)t = L^{-1}(s) t=L−1(s)
反带入Q(t)Q(t)Q(t),得
Q(t)=Q(L−1(s))=Z(s)Q(t) = Q(L^{-1}(s)) = Z(s) Q(t)=Q(L−1(s))=Z(s)

sss的区间显然是[0, 曲线总长度],于是我们可以对sss做匀速递增,从而得到Q(t)Q(t)Q(t)的位置, 从而完成匀速插值。

难点在于求S=L(t)S=L(t)S=L(t),这实际上是一个求积分的问题。很遗憾,一般来说很难得到一个解析的积分公式的,实际中是通过数值计算方法得到积分值。

sss通过数值方法得到,也很难求逆得到ttt,可以通过牛顿迭代,或二分查找得到。

2.用数值积分实现s的积分

数值积分使用Guass-lengendre积分来实现,通过选定的几个积分点及权重,它神奇而快速的得到精度很高的积分值。我们直接来重点吧,该方法需要一张n阶权重表,比如5阶权重表:

及一个计算公式:
∫abf(x)dx=b−a2∑i=1nwif(b−a2xi+b+a2)\int_{a}^{b}f(x)dx = \frac{b-a}{2}\sum_{i=1}^{n}{w_{i}f(\frac{b-a}{2}x_{i}+\frac{b+a}{2})} ∫ab​f(x)dx=2b−a​i=1∑n​wi​f(2b−a​xi​+2b+a​)
对于样条曲线,我们有:
dsdt=∣∣Q′(t)∣∣ds=∣∣Q′(t)∣∣dts=∫0t∣∣Q′(x)∣∣dx\frac{ds}{dt} = ||Q'(t)|| \\ ds = ||Q'(t)||dt \\ s = \int_{0}^{t}||Q'(x)||dx dtds​=∣∣Q′(t)∣∣ds=∣∣Q′(t)∣∣dts=∫0t​∣∣Q′(x)∣∣dx

  • Q′(t)Q'(t)Q′(t)为Q(t)Q(t)Q(t)的导
    Q′(t)=3At2+2Bt+CQ'(t) = 3At^{2} + 2Bt + C Q′(t)=3At2+2Bt+C
  • ∣∣Q′(t)∣∣||Q'(t)||∣∣Q′(t)∣∣为该点处的长度:
    ∣∣Q′(t)∣∣=Qx′(t)2+Qy′(t)2||Q'(t)|| = \sqrt{Q_x'(t)^2 + Q_y'(t)^2} ∣∣Q′(t)∣∣=Qx′​(t)2+Qy′​(t)2​
  • 具体对于我们的公式,有:
    s=L(t)=∫0t∣∣Q′(x)∣∣dx=t2∑i=1nwi∣∣Q′(t2xi+t2)∣∣s= L(t) = \int_{0}^{t}||Q'(x)||dx = \frac{t}{2}\sum_{i=1}^{n}{w_{i}||Q'(\frac{t}{2}x_{i}+\frac{t}{2})||} s=L(t)=∫0t​∣∣Q′(x)∣∣dx=2t​i=1∑n​wi​∣∣Q′(2t​xi​+2t​)∣∣

将表中的值依次带入,迭代计算即可得到ttt点处的积分值sss。比我之前快速实现时所采用的线性分割方法快了100倍有没有?特别是该方程的普适性,对于多阶多项式都适用而且精度非常高。有种魔性在这里,高斯是神。

3.牛顿迭代求解s对应的t

现在s=L(t)s=L(t)s=L(t)对我们来说是已知了,那么如何求sss所对应的ttt呢?这实际上是求方程:
L(t)−s=0L(t) - s = 0 L(t)−s=0
的根。因为L(t)L(t)L(t)没有解析表达,我们将使用牛顿迭代法:
b=a−f(a)f′(a)b= a - \frac{f(a)}{f'(a)} b=a−f′(a)f(a)​
将得到的b的值作为a再带入上述公式,迭代几次即可逼近s=f(x)s = f(x)s=f(x)的根。具体到我们的公式:
b=a−L(a)−sL′(a)b= a - \frac{L(a) - s}{L'(a)} b=a−L′(a)L(a)−s​
对于特定的sss,我们首先要拟定一个初值aaa,因为样条曲线性质良好,而且一般说来实际中不会允许2点间出现陡峭的曲线,一定会多加一些点令2点间曲线形状为凸或凹的,所以我们可以近似认为ttt在区间[0, 1]的比例,近似等于sss与总长度的比例。而显然总长为L(1),通过前面的高斯积分已经可以算出,于是初始值aaa我们可拟定为:
a=sL(1)a = \frac{s}{L(1)} a=L(1)s​
反复迭代(3-4次的精度就不错了),得出最终ttt值,再把该值反带入Q(t)Q(t)Q(t)中,得到对于给定s值所对应的位置,至此我们完成了样条曲线的重参数化。

4.直接推导二阶贝塞尔曲线的长度积分解析式

https://blog.csdn.net/LANGZI7758521/article/details/52101672

样条曲线长度--数值积分相关推荐

  1. OpenDRIVE 1.6 参考线采样方法

    目录 Catalog 前言 Foreword 坐标系 Coordinate Systems 参考线几何描述 Geometry 直线 Line 参考线坐标系 e s ⃗ , e t ⃗ , e h ⃗ ...

  2. SOLIDWORKS 2014官方正版功能介绍

    solidworks2014正式上线,SW2014新版本主要增强功能是对现有产品的改进,并提供了新的创新功能.其中包括新增交互功能.新增功能范例.新增pdf和html的帮助说明等等. solidwor ...

  3. solidworks 32位计算机,SolidWorks2016

    很多从事机械设计行业的用户都听过SolidWorks的大名,本次小编为大家带来SolidWorks2016最新版,新版优化了使用者界面,支持真实螺纹功能,可以帮助用户快速设计出3D机械图. 软件功能 ...

  4. 用matlab画曲顶柱体费用数据,数值积分的matlab实现

    实验10 数值积分 实验目的: 1.了解数值积分的基本原理: 2.熟练掌握数值积分的MATLAB 实现: 3.会用数值积分方法解决一些实际问题. 实验内容: 积分是数学中的一个基本概念,在实际问题中也 ...

  5. MATLAB 求曲线长度

    1. 求曲线长度积分公式 2. 已知曲线方程 3. 已知系数,曲线方程为 y = 0.0001 * x³ + 0.0005 * x² + 20 4. 已知曲线的x的起点和终点 -90.78 ,90.7 ...

  6. ESL第十六章 集成学习 汉明码、前向分段线性回归/前向逐步回归/Bet on Sparsity原则/噪信比/正则化路径/标准化L1间隔、学习集成/数值积分/集成生成/重要性采样/规则集成

    (这一章的内容感觉很琐碎,很难提出主线.总的来说,应该还是正则路径和重要性采样的学习集成两块内容) 目录 16.1 导言 16.2 提升和正则化路径Regularization Path 16.2.1 ...

  7. 【MATLAB】数据分析之函数数值积分

    一.数值积分问题的数学表达 称为积分节点,称为求积系数.右端公式称为左端定积分的某个数值积分.MATLAB支持三重以下的积分运算.分别为: 在计算积分时,要求积分区间是确定的. 二.一元函数的数值积分 ...

  8. R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集、非线性:基函数展开和样条分析、你简单分析的不重要特征,可能只是线性不显著、而非线性是显著的

    R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集.非线性:基函数展开和样条分析.你简单分析的不重要特征,可能只是线性不显著.而非线性是显著的 目录

  9. R语言限制性立方样条(RCS, Restricted cubic spline)分析:基于logistic回归模型、南非心脏病数据集(South African Heart Disease)

    R语言限制性立方样条(RCS, Restricted cubic spline)分析:基于logistic回归模型.南非心脏病数据集(South African Heart Disease) 目录

最新文章

  1. 【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★
  2. Delphi制作图像特殊显示效果
  3. java事务过大影响系统性能吗_Java编程性能优化-影响性能的因素你都知道吗?
  4. linux鼠标触摸屏应用程序,在Ubuntu环境下实现插入鼠标自动关闭触摸板
  5. OpenCV形态转换Morphology Transformations
  6. Java 字符串分割陷阱
  7. 如何使Xcode占用更少的空间 Xcode占用空间太大解决方法
  8. zookeeper的安装与配置(单机和集群)
  9. ubantu 添加防火墙策略_Ubuntu防火墙安装和配置
  10. Struts2之checkboxlist 设置默认值和结果回显
  11. CMMI认证过程中实施步骤详解
  12. Springboot - Ambiguous handler methods mapped
  13. 计算机主机配置图示,2020台式电脑组装配置单图
  14. ssl申请证书的步骤是如何的呢?
  15. rss下载_Microsoft下载中心RSS提要
  16. 获取手机机身和外置SD卡存储容量的方法
  17. 用Java写一个集合竞价抓涨停的策略
  18. FFmpeg命令(二)、 从视频中提取音频
  19. 创业基础(第五章:商业模式及其设计与创新) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  20. PRN(20201231):驾驶人驾驶决策机制遵循最小作用量原理

热门文章

  1. windos找不到文件:打开fla文件时候报错!
  2. 使用jsfl批量生成fla文件(文件是在多个文件夹下)如果是单个文件夹下也可以
  3. 【学习打卡04】可解释机器学习笔记之Grad-CAM
  4. 【SpringCloud深入浅出系列】SpringCloud组件之集成Zuul实现过滤器
  5. 【万字长文】2022年最全的搭建Web自动化测试框架教程
  6. 基于微信小程序的食堂窗口自助点餐系统设计与实现-计算机毕业设计源码和lw文档
  7. C++中的FILL和MEMSET(zzl)
  8. Linux学习:第一天_笔记
  9. 二维码活码源码(含数据库脚本)
  10. Linux下的一些时间说明