文章目录

  • 初步感受一下bezier曲线
  • 14.1 多项式曲线 Polynomial curves
  • 14.2 分段曲线Piecewise polynomial curves
  • 14.3 曲线参数化
  • 14.4 平面曲线
  • 样条
  • 14.5 插值方法Interpolation methods
    • 14.5.1 Hermite cubic splines插值样条曲线
    • 14.5.2 Catmul-Rom splines插值样条曲线(改良)
    • 14.5.3 Cardinal splines 样条曲线(改良)
    • 14.5.4 Kochanek-Bartels样条
  • 15.1 逼近样条(该部分内容准确性待定)
    • 15.2 Bezier样条——逼近样条
    • 15.2 B样条——逼近样条
    • 15.3 Beta样条——逼近样条
    • 15.4 有理样条(Rational Spline)
  • 其他
  • 参考:

http://www.ae.metu.edu.tr/~ae464/splines.pdf

初步感受一下bezier曲线

bezier([5,10,15,20,25],[0 8 10 9 1])


function [X,Y]=bezier(x,y)  %定义这个子函数,可以被main调用,这里我们直接坐标赋值
x=[5,10,15,20,25]
y=[0 8 10 9 1]n=length(x);  %获取输入的坐标点的个数,例如:测试的X坐标[5,10,15,20,25]为作业要求4次曲线
t=linspace(0,1);  % 改变式中的t值,则点就会在空间移动
xx=0;  %初始化X
yy=0;  %初始化Y
for k=0:n-1  %伯恩斯坦的一般形式,我们输入了5个坐标,因此是四次贝塞尔曲线tmp=nchoosek(n-1,k)*t.^k.*(1-t).^(n-1-k);  % nchoosek 来实现二项式系数或所有组合语法: C = nchoosek(n,k)xx=xx+tmp*x(k+1);  % X轴坐标yy=yy+tmp*y(k+1);  %  Y轴坐标
end
if nargout==2   %输出参数的个是为2个时X=xx;Y=yy;
endh=plot(xx,yy);  %画四次贝塞尔曲线hold on      %保留本曲线m=plot(x,y);   %画原始点

14.1 多项式曲线 Polynomial curves


一个常量,可由一个点唯一确定
一条直线,可由两个点唯一确定
一条抛物线,可由三个点唯一确定
一条三次曲线,可由四个点唯一确定,并且它拥有一个拐点。
三次曲线是多项式曲线中拥有拐点的最高项次数最小的曲线
拐点使它拥有非常有意义的作用,可以用它将多个点平滑地连接起来。

一条三次曲线,需要由四个系数的多项式来描述:

a+bx+cx2+dx3=y
a+bx+cx2+dx3=y
由已知的四个点,可以构造四个方程,解这四个方程即可求出四个系数。可由矩阵的逆运算得到:

Ma=y⇒a=M−1y
Ma=y⇒a=M−1y

矩阵运算使得用计算机求解非常容易。

边界条件

两个相邻曲线段在公共边界(控制点)处有相同的一阶和二阶导数,即自然三次样条具有二阶导数连续性
主要缺点

任意一个控制点发生了变动,则整条曲线都将受到影响。这样,自然三次样条不允许“局部控制”,因此不给出完整的新控制点集,则不可能构造曲线的一部分。

14.2 分段曲线Piecewise polynomial curves

复杂的曲线,可以由多个三次曲线连续起来成形。(得益于拐点)
于是我们可以将曲线以每两点进行分段,分别求出两点间的三次曲线。

为了使这些三次曲线平滑地相连,我们约束连接点处必须是连续的,并且一次导数和二次导数都是连续的。于是通过两个点和两个约束,我们就有了四个方程,可解出该多项式的四个系数,同时保证它与相邻的三次曲线是连续的。(由于起始端点和结束端点没有导数,所以我们需要人工指定两个斜率)

将多段曲线同时置入一个矩阵,即可一次性求出全部系数。

14.3 曲线参数化

到目前为止,我们已经了解了控制点序列如何使用三次方函数定义控制点之间的曲线段并在段连接处执行各种连续性级别,从而定义分段多项式曲线。 特别:

•C0连续性,表示两个线段匹配联接处的值。
•C1连续性,表示它们与连接处的斜率匹配。
•C2连续性,表示它们与连接处的曲率匹配


上面的方法得到的都是基于x轴的曲线,这并不好用。我们希望每段曲线都通过参数t描述:

fi(ti)=ai+biti+citi2+diti3(0⩽t⩽1)f_i(t_i)=a_i+b_it_i+c_it^2_i+d_it^3_i (0⩽t⩽1)fi​(ti​)=ai​+bi​ti​+ci​ti2​+di​ti3​(0⩽t⩽1)

在示例中,两条曲线是相同的,但是描述它们的方程式是不同的。 在右侧的参数形式中,我们定义了参数t0,t1和t2,它们在控制点之间沿x轴移动时在0和1之间变化。 我们可以写方程式:

关联t的原始x坐标。 导数表示每个t在我们沿x方向移动时有多快变化
Now we specify each curve segment by a parametric cubic curve

重要的是,这些量应在空间(即x)中而不是在参数坐标中计算,因为我们希望曲线在空间中平滑连接,而不是相对于我们的任意参数化而言

回顾之前的示例,我们没有进行参数化,因此可以重写所有方程式以及必须求解的最终线性系统。

这种方法的最大优势在于,因为我们已经知道所有系数的值,所以我们为每个控制点从矩阵中减少了一行和一列。

一旦您了解了分段参数化的概念,其余部分将以一种直接的方式进行。

14.4 平面曲线

将参数化后的曲线分别应用的两个坐标轴上,我们可以在2维平面上构造任意曲线!使其头尾相连,可形成环。

样条

分类方法
给定一组控制点,有两种方式选取分段连续参数多项式函数:

插值样条:曲线经过控制点。
逼近样条:曲线不经过控制点。

所谓样条曲线(Spline Curves)是指给定一组控制点而得到一条曲线,曲线的大致形状由这些点予以控制,一般可分为插值样条和逼近样条两种,插值样条通常用于数字化绘图或动画的设计,逼近样条一般用来构造物体的表面。

14.5 插值方法Interpolation methods

样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种

虽然多项式曲线已经这么牛逼,但是它使用一个矩阵来计算整个曲线,所以当用户调整其中的一个点的时候,会影响整个曲线的形状。这对造形来说是一个灾难,我们希望能够局部修改曲线

14.5.1 Hermite cubic splines插值样条曲线

为了实现这个需求,我们可以将多项式的两个约束改为用户指定每个分段两个端点的斜率,这样就可以将单点变化的影响缩小到局部了。多项式曲线变成了 Hemiter 曲线。

Hermite插值不仅满足在结点上与原函数相等,且各阶导数也相等。
在分段低次插值时候,可以选择分段线性插值和分段Hermite插值的方法,采用后者得到的结果即为Hermite样条。

与自然三次样条不同,Hermite样条可以局部调整,因为每个曲线端仅依赖于端点约束。

主要缺点
只有当被插值函数在所有插值点处的函数值和导数都已知的前提下才能使用,而且在内节点处,其二阶导数一般不连续。基于Hermite样条的改进方法是Cardinal样条和Kochenek-Bartels样条。

14.5.2 Catmul-Rom splines插值样条曲线(改良)

Hemiter 曲线要求用户提供每个点的斜率,并不是那么方便。 Catmul-Rom 提供了一种自动设置斜率的方法:每个点的斜率由前后两个点决定。

ti=12(pi+1−pi−1)ti+1=12(pi+2−pi)

Cardinal样条

类似于Hermite样条,Cardinal样条也是插值分段三次曲线,并且每条曲线的端点位置均指定切线。
与Hermite不同的是,Cardinal样条不一定要给出端点的切线值。
在cardinal样条中,一个控制点的斜率值可以由两个相邻控制点的坐标进行计算。

14.5.3 Cardinal splines 样条曲线(改良)

Cardinal 曲线为 Catmul-Rom 的斜率生成提供了一个可选参数t。当t=0时,Cardinal 曲线即为 Catmul-Rom 曲线。当 t>0 时,得到绷紧后的 Catmul-Rom 曲线。反之 t<0 时,得到松跨后的 Catmul-Rom 曲线。

ti=12(1−t)(pi+1−pi−1) ti+1=12(1−t)(pi+2−pi)

14.5.4 Kochanek-Bartels样条

这是cardinal样条的扩展。将两个附加参数引入到约束方程中,可以得到Kochanek-Bartels样条,从而为调整曲线段形状提供更多方便。需要注意的是,导数在线段边界处不一定连续,因为 本样条的设计是为了模拟动画路径,特别是当对象运动有突变时。

15.1 逼近样条(该部分内容准确性待定)

15.2 Bezier样条——逼近样条

Bezier曲线是BSpline的特例,虽然它也是分段多项式,但是Bezier多项式的次数并不是三,而是由将逼近控制点数量及相关位置决定。

特性

  • 曲线总是通过第一个和最后一个控制点;
  • 曲线在始点处的切线落在前两个控制的连线上,曲线在终点处的切线落在最后两个控制点的连线上。

15.2 B样条——逼近样条

B样条曲线会经过每个型值点(型值点vs控制点),但是不经过控制点,也即是说,型值点是B样条曲线所经过的点,而控制点则是控制其形状的点。

优点

  • 和Bezier样条一样,B样条也是通过逼近一组控制点来产生的。但是B样条的具有两个Bezier样条所不具备的特点:
  • B样条多项式的次数可独立于控制点数目(有一定限制);
  • B样条允许局部控制曲线或曲面。

缺点

  • 缺点就是比Bezier样条更复杂。

分类

  • B样条通常根据所选的节点向量类型进行描述,节点向量有三种分类:均匀的(uniform)、开放均匀的(open uniform)和非均匀的(nonuniform)。

15.3 Beta样条——逼近样条

B样条是一般化的beta样条,它是在beta样条的一阶和二阶导数上加上几何条件而形成的。

15.4 有理样条(Rational Spline)

有理函数是两个多项式之比,因此有理样条是两个样条函数之比,例如有理B样条。

有理样条和非有理样条比,有两个重要的优点:

  • 提供了二次曲线的精确表达式,如圆和椭圆,非有理样条仅能逼近二次曲线;
  • 对于透视变换是不会变化的。

其他

  • 贝塞尔曲线
  • Chaikin曲线
  • 利萨茹曲线

它们各有特点:

  • 贝塞尔曲线通过两个端点和多个控制点来构造。插值容易,但端点处的斜率不容易控制,控制点牵一发而动全身。
  • Chaikin曲线通过直线边来构造。用迭代法构造,几乎不可能用于插值。
  • 利萨茹曲线以不同相位和振幅的正弦函数来构造。位置由参数可直接获得,可以用来做一些特效。

应用:在游戏中,常常给定一些坐标点,让角色逐一通过。角色在运动的时候,沿着这些点平滑地移动。所以我们需要有一些方法能求出通过给点坐标集合的曲线。

参考:

https://blog.csdn.net/while0/article/details/51513485
https://blog.csdn.net/weixin_34392435/article/details/86184081
http://blog.leanote.com/post/simon88/%E6%A0%B7%E6%9D%A1%E6%9B%B2%E7%BA%BF#title
教材:http://www.ae.metu.edu.tr/~ae464/splines.pdf

多项式曲线,分段曲线,曲线参数化,平面曲线,插值方法的样条曲线相关推荐

  1. ITK:分段线性曲线的数据结构

    ITK:分段线性曲线的数据结构 内容提要 输出结果 C++实现代码 内容提要 分段线性曲线的数据结构 输出结果 [0, 0] [0, 1] [0, 2] [0, 3] [0, 4] [0, 5] [0 ...

  2. MATLAB 绘制分段函数曲线并添加图形标注(至少包括标题和坐标轴说明)

    分段函数: 其中0≤X≤10,x与y坐标轴范围分别为[0 10]和[0 2.5]. 代码: x=linspace(0,10,100); y=[]; for x0=xif x0>=8y=[y,1] ...

  3. 光滑曲线_微分几何笔记(2) —— 曲线的参数化

    第二周讲完了Klingenberg的第一章Curves,做一点微小的笔记. 分成三个部分,本篇讲曲线的弧长参数:下一篇讲一般的Frenet标架及方程组:再下一篇讲二维三维空间曲线的curvature ...

  4. 曲线均匀分布_曲线篇:深刻理解B 样条曲线(下)

    前两篇中讲解了贝塞尔曲线和B样条基础. FrancisZhao:曲线篇: 贝塞尔曲线​zhuanlan.zhihu.com FrancisZhao:曲线篇:深刻理解B 样条曲线(上)​zhuanlan ...

  5. 样条曲线(下)之插值问题(贝塞尔曲线、B样条和一般样条曲线插值)

    贝塞尔曲线插值与B样条插值 前言: 这篇是"样条曲线"的接续,前面主要集中在了理论部分,这篇文章主要内容是贝塞尔曲线与B样条是如何应用到插值中的. 前篇:样条曲线 文章目录 贝塞尔 ...

  6. 用matlab绘制分段函数曲线

    代码: x=linspace(-5,5,100); y=[]; for x0=x; if x0>0     y=[y,1/2*log(x0+sqrt(1+x0.^2))]; else     y ...

  7. matlab画光顺曲线,曲线曲面

    一. 计算机图形学三大块内容:光栅图形显示.几何造型技术.真实感图形显示. 光栅图形学是图形学的基础,有大量的思想和算法. 几何造型技术是一项研究在计算机中,如何表达物体模型形状的技术 描述物体的三维 ...

  8. php 干扰曲线,曲线干扰控制

    以前一直是用 Pro/E,现在老板对我们有更高的要求,不仅要求会做结构,还要求外观也 一起做.那只好自己充电了.我希望更快的学好这门软件,掌握更多的窍门,少走一些弯路,但对 于我这个刚接触犀牛十几天的 ...

  9. MATLAB基础篇——微积分应用

    MATLAB基础篇--微积分应用 函数极限 导数 定积分与不定积分 二重积分与三重积分 曲线积分 曲面积分 级数 微分方程和微分方程组的解析解 函数极限 limit函数: limit(f,x,a,'l ...

  10. 多项式曲线——搞清楚贝塞尔曲线、B样条曲线、Nurbs曲线的区别

    多项式曲线--搞清楚贝塞尔曲线.B样条曲线.nurbs曲线的区别 贝塞尔曲线 Bezier曲线定义 Bernstein基函数的性质 Bezier曲线的性质 B样条曲线 B样条曲线定义 B样条基函数的性 ...

最新文章

  1. 吴恩达团队最新成果:用深度学习来改善临终关怀服务
  2. 关于编译原理的一点看法
  3. power linux 安装系统,powershell 安装服务器
  4. 一个判断字符串是否是数字的正则表达式
  5. 12.20今日头条实习面试总结-算法工程师
  6. 解析vue-ssr构建流程
  7. python字符串的内建函数_python的字符串内建函数
  8. Mac终端打开VsCode
  9. apm最高的记录_APM工具使用记录
  10. 电商直播平台开发一般包含哪几种模式?
  11. ThinkPHP中IP地址定位,包括IP地址库文件
  12. 【计组】偏移地址、段地址和寻址方式
  13. 《白鹿原》读书笔记——纪实的戏剧
  14. Java篇第三回——运算符、表达式与语句(C不好的也快来)
  15. 灵魂显示正在登录聊天服务器,Soul跟随灵魂找到你
  16. API和SDK是什么?有什么区别?如何测试SDK?一篇文章统统告诉你!
  17. python3.7安装scrapy_Python3.7下scrapy框架的安装
  18. js 数组遍历符合条件跳出循环体_Js数组遍历方法对比总结
  19. STM32定时器+ADC制作简易示波器
  20. 软件工程硕士是否值得读?

热门文章

  1. PyTorch神经网络搭建入门
  2. sublime双击选中$
  3. Ubuntu配置NFS服务器与客户端
  4. Error while executing: am start -n错误解决方案
  5. 其实你的领导也有中年危机
  6. html能在hade中注释吗,A第1章 HTML超文本标记语言(1-20)OK.doc
  7. html label input同行,bootstrap中怎样让label和input在同一行
  8. python代码怎么运行_如何让Python代码加速运行?
  9. json获取key对应的值java_java 获取json字符串中key对应的值
  10. mysql能将查询结果与表左查询_mysql重点,表查询操作和多表查询