样条曲线长度--数值积分
转载自: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})} ∫abf(x)dx=2b−ai=1∑nwif(2b−axi+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=2ti=1∑nwi∣∣Q′(2txi+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
样条曲线长度--数值积分相关推荐
- OpenDRIVE 1.6 参考线采样方法
目录 Catalog 前言 Foreword 坐标系 Coordinate Systems 参考线几何描述 Geometry 直线 Line 参考线坐标系 e s ⃗ , e t ⃗ , e h ⃗ ...
- SOLIDWORKS 2014官方正版功能介绍
solidworks2014正式上线,SW2014新版本主要增强功能是对现有产品的改进,并提供了新的创新功能.其中包括新增交互功能.新增功能范例.新增pdf和html的帮助说明等等. solidwor ...
- solidworks 32位计算机,SolidWorks2016
很多从事机械设计行业的用户都听过SolidWorks的大名,本次小编为大家带来SolidWorks2016最新版,新版优化了使用者界面,支持真实螺纹功能,可以帮助用户快速设计出3D机械图. 软件功能 ...
- 用matlab画曲顶柱体费用数据,数值积分的matlab实现
实验10 数值积分 实验目的: 1.了解数值积分的基本原理: 2.熟练掌握数值积分的MATLAB 实现: 3.会用数值积分方法解决一些实际问题. 实验内容: 积分是数学中的一个基本概念,在实际问题中也 ...
- MATLAB 求曲线长度
1. 求曲线长度积分公式 2. 已知曲线方程 3. 已知系数,曲线方程为 y = 0.0001 * x³ + 0.0005 * x² + 20 4. 已知曲线的x的起点和终点 -90.78 ,90.7 ...
- ESL第十六章 集成学习 汉明码、前向分段线性回归/前向逐步回归/Bet on Sparsity原则/噪信比/正则化路径/标准化L1间隔、学习集成/数值积分/集成生成/重要性采样/规则集成
(这一章的内容感觉很琐碎,很难提出主线.总的来说,应该还是正则路径和重要性采样的学习集成两块内容) 目录 16.1 导言 16.2 提升和正则化路径Regularization Path 16.2.1 ...
- 【MATLAB】数据分析之函数数值积分
一.数值积分问题的数学表达 称为积分节点,称为求积系数.右端公式称为左端定积分的某个数值积分.MATLAB支持三重以下的积分运算.分别为: 在计算积分时,要求积分区间是确定的. 二.一元函数的数值积分 ...
- R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集、非线性:基函数展开和样条分析、你简单分析的不重要特征,可能只是线性不显著、而非线性是显著的
R语言splines包构建基于logistic回归的自然样条分析:南非心脏病数据集.非线性:基函数展开和样条分析.你简单分析的不重要特征,可能只是线性不显著.而非线性是显著的 目录
- R语言限制性立方样条(RCS, Restricted cubic spline)分析:基于logistic回归模型、南非心脏病数据集(South African Heart Disease)
R语言限制性立方样条(RCS, Restricted cubic spline)分析:基于logistic回归模型.南非心脏病数据集(South African Heart Disease) 目录
最新文章
- 【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★
- Delphi制作图像特殊显示效果
- java事务过大影响系统性能吗_Java编程性能优化-影响性能的因素你都知道吗?
- linux鼠标触摸屏应用程序,在Ubuntu环境下实现插入鼠标自动关闭触摸板
- OpenCV形态转换Morphology Transformations
- Java 字符串分割陷阱
- 如何使Xcode占用更少的空间 Xcode占用空间太大解决方法
- zookeeper的安装与配置(单机和集群)
- ubantu 添加防火墙策略_Ubuntu防火墙安装和配置
- Struts2之checkboxlist 设置默认值和结果回显
- CMMI认证过程中实施步骤详解
- Springboot - Ambiguous handler methods mapped
- 计算机主机配置图示,2020台式电脑组装配置单图
- ssl申请证书的步骤是如何的呢?
- rss下载_Microsoft下载中心RSS提要
- 获取手机机身和外置SD卡存储容量的方法
- 用Java写一个集合竞价抓涨停的策略
- FFmpeg命令(二)、 从视频中提取音频
- 创业基础(第五章:商业模式及其设计与创新) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
- PRN(20201231):驾驶人驾驶决策机制遵循最小作用量原理
热门文章
- windos找不到文件:打开fla文件时候报错!
- 使用jsfl批量生成fla文件(文件是在多个文件夹下)如果是单个文件夹下也可以
- 【学习打卡04】可解释机器学习笔记之Grad-CAM
- 【SpringCloud深入浅出系列】SpringCloud组件之集成Zuul实现过滤器
- 【万字长文】2022年最全的搭建Web自动化测试框架教程
- 基于微信小程序的食堂窗口自助点餐系统设计与实现-计算机毕业设计源码和lw文档
- C++中的FILL和MEMSET(zzl)
- Linux学习:第一天_笔记
- 二维码活码源码(含数据库脚本)
- Linux下的一些时间说明