样条曲线总结

0 前言

    根据给定一组控制点坐标,可使用以下两种方法之一选取分段连续参数多项式函数:

  • 插值样条:当选取的多项式使得曲线通过每个控制点时,则所得曲线称为这组控制点的插值样条曲线;
  • 逼近样条:当选取的多项式使得部分或全部控制点都不在生成的曲线上,所得曲线称为逼近样条曲线。

1 插值样条

1.1 自然三次样条(Natural Cubic Spline)

  • 边界条件

    两个相邻曲线段公共边界(控制点)处有相同的一阶和二阶导数,即自然三次样条具有二阶导数连续性[1]P129,[2]P349。

  • 主要缺点

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

1.2 Hermite样条

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

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

  • 边界条件

    略,详见参考资料[1]P349。

  • 主要缺点

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

1.3 Cardinal样条

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

    实现:VTK中有个vtkCardinalSpline类

1.4 Kochanek-Bartels样条    

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

  • 边界条件

    略,详见参考资料[1]P354。

  • 实现

    VTK中有个vtkKochanekSpline类

2 逼近样条

2.1 Bezier样条

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

  • 特性

    {a} 曲线总是通过第一个和最后一个控制点[1]P359;

    (b) 曲线在始点处的切线落在前两个控制的连线上,曲线在终点处的切线落在最后两个控制点的连线上[1]P359。

  • 实现

    VTK中vtkPath类使用Bezier来产生曲线。

2.2 B样条

2.2.1 型值点vs控制点

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

2.2.2 优点

    和Bezier样条一样,B样条也是通过逼近一组控制点来产生的。但是B样条的具有两个Bezier样条所不具备的特点:

(a) B样条多项式的次数可独立于控制点数目(有一定限制);

(b) B样条允许局部控制曲线或曲面。

2.2.3 缺点

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

2.2.4 分类

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

2.3 Beta样条

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

2.4 有理样条(Rational Spline)

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

2.4.1 优点

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

(a) 提供了二次曲线的精确表达式,如圆和椭圆,非有理样条仅能逼近二次曲线;

(b) 对于透视变换是不会变化的。

参考资料

[1]计算机图形学(第三版),电子工业出版社

[2]计算方法(第2版),电子工业出版社

[3]样条曲线

[4]B-spline

[5]如何通过一组B曲线的型值点反求其控制点

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
图形学大作业----内容 一、主菜单的菜单项 基本图形绘制、图形变换、自由曲线绘制、图形裁剪、图形填充 二、二级子菜单(基本图形绘制) 1.直线绘制: 1)Bresenham绘制直线 2)DDA绘制直线 3)改进的Bresenham绘制直线 4)系统库函数绘制直线——直线线宽、线形设计 2.绘制圆(中点Bresenham) 3.Bresenham绘制椭圆 4.矩形、正方形的绘制 5.任意多边形的绘制 6.任意圆弧的绘制 三、二级子菜单(图形变换) 1.基本图形变换 1)平移变换 2)比例变换(等比例、不等比例) 3)错切变换(x方向、y方向、x-y方向) 4)对称变换(坐标轴、原点、45°直线) 5) 旋转变换(顺时针旋转、逆时针旋转) 2.复合变换(两次变换) 1)复合平移变换 2)复合比例变换 3)复合旋转变换 3.相对任意参考点的比例变换 4.相对任意直线的错切变换 四、二级子菜单(自由曲线绘制) 1. Bezier 曲线绘制 1)1次Bezier曲线 2)2次Bezier曲线 3)3次Bezier曲线 2. 3次B样条曲线 3. Hermite三次样条曲线 4. 2次Bezier曲线的拼接 五、二级菜单(图形裁剪和图形填充) 1.图形裁剪(直线裁剪) 2.图形填充 附加: 撰写大作业要求: 1)要求作品的系统设计结构合理,条理清晰,界面友好;具有较强的交互能力,完成功能。 2)要求使用visual studio进行系统开发,提供源代码项目文件夹和可执行文件(生成release的exe文件)。 3)大作业报告要求撰写字迹工整,条理清晰,语言流畅。 内容包括:1)设计概述 2)软硬件运行环境 3)系统功能设计(系统功能图) 4)算法原理 5)成果展示(打印,并裁剪为合适大小,粘贴在报告中。) 6)实现代码(打印) 7)个人总结
在VC中绘制样条曲线,可以使用GDI+库提供的功能。样条曲线可以是基数样条或贝塞尔样条。基数样条由一系列点和张力参数定义,而贝塞尔样条由两个端点和两个控制点定义。以下是一个示例代码,演示如何在VC中绘制基数样条曲线: ```cpp #include <windows.h> #include <gdiplus.h> using namespace Gdiplus; void DrawSplineCurve(HDC hdc) { Graphics graphics(hdc); Pen pen(Color::Blue, 2.0f); Point points\[\] = { Point(0, 100), Point(50, 80), Point(100, 20), Point(150, 80), Point(200, 100) }; graphics.DrawCurve(&pen, points, 5); } ``` 这段代码使用了GDI+库中的Graphics类和Pen类来绘制基数样条曲线。首先创建一个Graphics对象,然后创建一个Pen对象来指定曲线的颜色和宽度。接下来,定义一个Point数组来存储曲线上的点的坐标。最后,使用Graphics对象的DrawCurve方法来绘制曲线。 如果你想绘制填充的封闭曲线,可以使用以下代码: ```cpp void DrawClosedCurve(HDC hdc) { Graphics graphics(hdc); Pen pen(Color::Blue, 2.0f); SolidBrush brush(Color::Red); Point points\[\] = { Point(10, 30), Point(50, 80), Point(100, 20), Point(150, 80), Point(150, 50) }; graphics.DrawClosedCurve(&pen, points, 5); graphics.FillClosedCurve(&brush, points, 5); } ``` 这段代码在绘制封闭曲线之前,先创建了一个SolidBrush对象来指定填充的颜色。然后使用Graphics对象的DrawClosedCurve方法绘制封闭曲线,再使用FillClosedCurve方法填充曲线内部。 请注意,以上代码只是示例,你可以根据自己的需求进行修改和扩展。 #### 引用[.reference_title] - *1* *2* *3* [GDI+ 绘制曲线方法总结](https://blog.csdn.net/lizhichao410/article/details/124448475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneSea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值