三次B样条曲线拟合算法

三次B样条曲线拟合算法三次B样条曲线方程B样条曲线分为近似拟合和插值拟合,所谓近似拟合就是不过特征点,而插值拟合就是通过特征点,但是插值拟合需要经过反算得到控制点再拟合出过特征点的B样条曲线方程。这里会一次介绍两种拟合算法。首先介绍B样条的曲线方程。B样条曲线的总方程为:P(t)=∑ni=0PiFi,k(t)P(t)=\sum_{i=0}^{n}P_{i}F_{i,k}(t)(1)其中PiP_i是控制曲

大家好,又见面了,我是你们的朋友全栈君。

1 三次B样条曲线方程

B样条曲线分为近似拟合和插值拟合,所谓近似拟合就是不过特征点,而插值拟合就是通过特征点,但是插值拟合需要经过反算得到控制点再拟合出过特征点的B样条曲线方程。这里会一次介绍两种拟合算法。首先介绍B样条的曲线方程。
B样条曲线的总方程为: P ( t ) = ∑ i = 0 n P i F i , k ( t ) P(t)=\sum_{i=0}^{n} P_{i}F_{i,k}(t) P(t)=i=0nPiFi,k(t) (1)
其中 P i P_i Pi是控制曲线的特征点, F i , k ( u ) F_{i,k}(u) Fi,k(u)则是K阶B样条基函数。
1.1 三次B样条曲线方程中基函数为:
F i , k ( t ) = 1 k ! ∑ m = 0 k − i ( − 1 ) m ( m k + 1 ) ( t + k − m − j ) k F_{i,k}(t)=\frac{1}{k!}\sum_{m=0}^{k-i}(-1)^{m}\binom{m}{k+1}(t+k-m-j)^k Fi,k(t)=k!1m=0ki(1)m(k+1m)(t+kmj)k (2)
其中 ( m k + 1 ) \binom{m}{k+1} (k+1m)表示阶乘,化成看的明白的式子就是:

这里写图片描述
将图片上的基函数代入到方程(1)中,就是:
P ( t ) = P 0 ∗ F 0 , 3 ( t ) + P 1 ∗ F 1 , 3 ( t ) + P 2 ∗ F 2 , 3 ( t ) + P 3 ∗ F 3 , 3 ( t ) P(t)= P_0*F_{0,3}(t)+P_1*F_{1,3}(t)+P_2*F_{2,3}(t)+P_3*F_{3,3}(t) P(t)=P0F0,3(t)+P1F1,3(t)+P2F2,3(t)+P3F3,3(t) (3)
方程(3)就是三次B样条曲线方程。


2019-04-18 更新

有小伙伴提到上式(2)的j是什么意思,其实j就是控制点的索引值。这里我把书上的公式摘抄下来,可能看起来更为清晰。
参考书籍:《计算机图形学 第3版》何援军 第13章
三次B样条曲线计算
F 0 , 3 ( t ) = 1 3 ! ∑ j = 0 3 ( − 1 ) j C 4 j ) ( t + 3 − 0 − j ) 3 F_{0,3}(t)=\frac{1}{3!}\sum_{j=0}^{3}(-1)^{j}C^{j}_{4})(t+3-0-j)^3 F0,3(t)=3!1j=03(1)jC4j)(t+30j)3

= 1 6 [ ( − 1 ) 0 C 4 0 ( t + 3 ) 3 + ( − 1 ) 1 C 4 1 ( t + 2 ) 3 + ( − 1 ) 2 C 4 2 ( t + 1 ) 3 + ( − 1 ) 3 C 4 3 t 3 ] =\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+3)^{3}+(-1)^{1}C^{1}_{4}(t+2)^{3}+(-1)^{2} C^{2}_{4}(t+1)^{3}+(-1)^{3}C^{3}_{4}t^{3}] =61[(1)0C40(t+3)3+(1)1C41(t+2)3+(1)2C42(t+1)3+(1)3C43t3]

= 1 6 ( − t 3 + 3 t 2 − 3 t + 1 ) = 1 6 ( 1 − t ) 3 =\frac{1}{6}(-t^{3}+3t^{2}-3t+1)=\frac{1}{6}(1-t)^{3} =61(t3+3t23t+1)=61(1t)3

F 1 , 3 ( t ) = 1 3 ! ∑ j = 0 2 ( − 1 ) j C 4 j ) ( t + 3 − 1 − j ) 3 F_{1,3}(t)=\frac{1}{3!}\sum_{j=0}^{2}(-1)^{j}C^{j}_{4})(t+3-1-j)^3 F1,3(t)=3!1j=02(1)jC4j)(t+31j)3

= 1 6 [ ( − 1 ) 0 C 4 0 ( t + 2 ) 3 + ( − 1 ) 1 C 4 1 ( t + 1 ) 3 + ( − 1 ) 2 C 4 2 t 3 ] =\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+2)^{3}+(-1)^{1}C^{1}_{4}(t+1)^{3}+(-1)^{2} C^{2}_{4}t^{3}] =61[(1)0C40(t+2)3+(1)1C41(t+1)3+(1)2C42t3]

= 1 6 ( 3 t 3 − 6 t 2 + 4 ) =\frac{1}{6}(3t^{3}-6t^{2}+4) =61(3t36t2+4)

F 2 , 3 ( t ) = 1 3 ! ∑ j = 0 1 ( − 1 ) j C 4 j ) ( t + 3 − 2 − j ) 3 F_{2,3}(t)=\frac{1}{3!}\sum_{j=0}^{1}(-1)^{j}C^{j}_{4})(t+3-2-j)^3 F2,3(t)=3!1j=01(1)jC4j)(t+32j)3

= 1 6 [ ( − 1 ) 0 C 4 0 ( t + 1 ) 3 + ( − 1 ) 1 C 4 1 t 3 =\frac{1}{6}[(-1)^{0}C^{0}_{4}(t+1)^{3}+(-1)^{1}C^{1}_{4}t^{3} =61[(1)0C40(t+1)3+(1)1C41t3

= 1 6 ( − 3 t 3 + 3 t 2 + 3 t + 1 ) =\frac{1}{6}(-3t^{3}+3t^{2}+3t+1) =61(3t3+3t2+3t+1)

F 3 , 3 ( t ) = 1 3 ! ∑ j = 0 0 ( − 1 ) j C 4 j ) ( t + 3 − 3 − j ) 3 F_{3,3}(t)=\frac{1}{3!}\sum_{j=0}^{0}(-1)^{j}C^{j}_{4})(t+3-3-j)^3 F3,3(t)=3!1j=00(1)jC4j)(t+33j)3

= 1 6 [ ( − 1 ) 0 C 4 0 t 3 =\frac{1}{6}[(-1)^{0}C^{0}_{4}t^{3} =61[(1)0C40t3

= 1 6 t 3 =\frac{1}{6}t^{3} =61t3


2 三次B样条曲线近似拟合

近似拟合很简单。不需要求控制点,求得 F i , k ( t ) F_{i,k}(t) Fi,k(t),由上述方程(3),代入 P 0 , P 1 , P 2 , P 3 P_0,P_1,P_2,P_3 P0,P1,P2,P3就可以得到由这四个点近似拟合的一段三次B样条曲线,起始点在 P 0 P_0 P0,终点在 P 1 P_1 P1,对于闭合轮廓,最后一段可以取前两点做辅助,拟合实验结果我最后一块给出。这种近似拟合曲线光滑,但是最大不足就是不过特征点,也就是不过 P i P_i Pi,需要过点需要反求控制点再拟合。

3 三次B样条插值拟合

插值拟合较为复杂。其实也不算是很复杂,找资料过程和理解过程是一个复杂的过程。不过有了前面大神做工作,我们只是借用别人的成果写代码就好了。我给大家看一篇论文,大家可以百度或者去知网搜索,闭合 B 样条曲线控制点的快速求解算法及应用。文章讲解了反求控制点的具体步骤,写的非常详细,基本上贴近代码的那种。大家可以根据这篇论文反求控制点,拟合出来的三次B样条曲线是经过 P i P_i Pi的。代码就不放了,很多,可以根据我给的那篇论文直接编写相应代码,有问题可以私信我,知无不言。
##4 拟合结果
这里写图片描述 原轮廓
这里写图片描述 近似拟合轮廓。可以看到没过黑色特征点,只是近似拟合
这里写图片描述 插值拟。可以看到曲线经过黑色特征点,不过有一些不足之处。

##5 总结
三次B样条曲线拟合轮廓效果还是可以,较之Beizer(可以参考我博客三次Beizer曲线拟合算法),B样条将一些细节描述的很好,很多细节之处都贴近原轮廓,但是有一些不足之处,可以看到对直线拟合效果不是很好。两篇博客都是关于闭合轮廓的拟合,对于非闭合或者只是一段曲线拟合,还有一种曲线是很好的,《数值分析》提到过,叫三次样条插值拟合,拟合效果很好,我做过拟合一元三次方程曲线,拟合效果跟原曲线非常贴近,不过过程中需要用到追赶法,而追赶法需要满足一个条件,对于闭合曲线三次样条插值是不满足这个条件的,所以我没去深研究,大家可以去试一试。谢谢大家!

————————————————-2018-10-30——————————————–
真的很感谢大家的支持,这一年都比较忙,找实习and找工作,而且这个东西是研一上学期搞的,现在看都毫无印象,对自己说一句:牛逼。我把代码放在网盘了(能运行,但现在没效果,大家可以检查下,之前是OK的),本来想上传到CSDN,好像要C币,而且要审核,太墨迹了。
链接: https://pan.baidu.com/s/1mSQMmvL71gwEAqgiT6O9Gg 提取码: xv5f

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150356.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharmimport时找不到指定文件_pycharm系统找不到指定文件

    pycharmimport时找不到指定文件_pycharm系统找不到指定文件1、现象系统提示找不到指定的文件:Errorrunning’hello’:Cannotrunprogram"B:\pystudy\venv\Scripts\python.exe"(indirectory"\python-study"):CreateProcesserror=2,系统找不到指定的文件。2、原因原来的工程目录(B盘)下,保存了python的编…

  • 渗透测试工具——SET「建议收藏」

    渗透测试工具——SET「建议收藏」社会工程学使用计谋、假情报或人际关系去获得利益和其他敏感信息。 攻击对象一-一人一-秘密信息的保存者,信息安全链中最薄弱的环节。 利用受害者的本能反应、好奇心、信任、贪婪等心理弱点进行欺骗、伤害。常见的社会工程学攻击方式环境渗透:对特定的环境进行渗透,是社会工程学为了获得所需的情报或敏感信息经常采用的手段之一。社会工程学攻击者通过观察目标对电子邮件的响应速度、重视程度以及可能提供的相关资料,比如一个人的姓名、生日、ID电话号码、管理员的IP地址、邮箱等,通过这些收集信息来判断目标的网

  • Vuex实践-mapState和mapGetters

    Vuex实践-mapState和mapGetters一.前言  本文章是vuex系列的最后一篇,主要总结的是如何使用mapState和mapGetters访问vuex中的state和getters。二.多个模块中mapState和mapGetters的使用  上一篇文章《Vuex实践(中)》里面我们总结的就是多模块的内容,所以关于store.js、moduleA.js和moduleB.js的代码保持不变。  在此为了方便观看,我将这…

  • Linux基础之正则表达式

    Linux基础之正则表达式正则表达式:又称规则表达式。(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串(包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符…

  • 关于ActionContext.getContext()的使用方法心得

    关于ActionContext.getContext()的使用方法心得

  • javascript refresh page 几种页面刷新的方法[通俗易懂]

    javascript refresh page 几种页面刷新的方法[通俗易懂]javascriptrefreshpage几种页面刷新的方法下面以三个页面分别命名为frame.html、top.html、bottom.html为例来具体说明如何做。frame.html由上(top.html)下(bottom.html)两个页面组成,代码如下:复制代码 代码如下:  frame       

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号