首页 利用java语言对三次样条曲线的实现

利用java语言对三次样条曲线的实现

举报
开通vip

利用java语言对三次样条曲线的实现利用java语言对三次样条曲线的实现 刘 丹 (大连广播电视大学 理工系,辽宁 大连 116021) 摘 要:计算机绘图的核心是画线,文中通过对样条曲线的数学概念进行分析,应用java语言中的系统相关类给出三次样条曲线的实现过程. 关键词:java 2d技术;样条曲线;平滑曲线 中图分类号:TP312JA 文献标识码:A 文章编号:1673-260X(2014)02-0008-02 Java语言中关于曲线问题的高级应用开发在jdk尚未支援2D图形之前,只可以画出直的、相同粗细的线条.现在可以通过2D A...

利用java语言对三次样条曲线的实现
利用java语言对三次样条曲线的实现 刘 丹 (大连广播电视大学 理工系,辽宁 大连 116021) 摘 要:计算机绘图的核心是画线,文中通过对样条曲线的数学概念进行分析,应用java语言中的系统相关类给出三次样条曲线的实现过程. 关键词:java 2d技术;样条曲线;平滑曲线 中图分类号:TP312JA 文献标识码:A 文章编号:1673-260X(2014)02-0008-02 Java语言中关于曲线问题的高级应用开发在jdk尚未支援2D图形之前,只可以画出直的、相同粗细的线条.现在可以通过2D API绘出不同粗细的线条及圆滑的曲线.通过系统java.awt.geom包中提供了Line2D、QuadCurve2D(二次贝塞尔曲线)及CubicCurve2D(三次贝塞尔曲线)等相关的类,让程序员能够轻松地绘出想要的线条.但想要画出更平滑的多个数据样本点的时候,贝塞尔曲线就不能满足要求了,为此,我们应采用样条曲线来完成.而曲线平滑的原则是,必须通过所有的样本点,另外,不论有多少样本点,曲线的阶次最大为三次,所以是稳定的. 1 三次样条曲线的数学原理 1.1 三次样条曲线的定义 对于给定的n个型值点Pi(xi,yi),且hi=xi+1-xi>0,i=1,2,..,n,若y=s(x)满足下列条件: (1)在Pi(xi,yi)点上有yi=s(xi); (2)S(x)在[x1,xn]上二阶连续可导; (3)在每个子区间[xi,xi+1]上,s(x)是x的三次多项式;则称s(x)为过型值点的三次样 条函数,由三次样条函数构成的曲线称为三次样条曲线. 三次样条函数曲线的求解条件 已知: (1)n个数据点Pi(xi,yi),i=1,..,n (2)每一段都是三次的多项式函数曲线 (3)节点达到二阶连续 (4)两个端点的特性(固定端\抛物端\自由端) 1.2 三次样条函数曲线的求解方法 曲线: Si(x)=ai+bi(x-xi)+ci(x-yi)2+di(x-xi)3 Mi=2Ci: ai=yi ci=Mi/2 di=(Mi+1-Mi)/6hi bi=(yi+1-y)/hi-hi(Mi/3)+Mi+1/6) Di=6/(hi-1+hi)*[(yi+1-yi)/hj-(yi-yi-1)/hi-1] 2 java编写的三次样条曲线关键代码 根据三次样条函数曲线的求解方法给出满足条件代码编辑 tt[i]=Math.sqrt((x[i]-x[i-1])*(x[i]-x[i-1])+(y[i]-y[i-1])*(y[i]-y[i-1])); switch(n) { case 2: break; case 3: for (i=1;i<n-1;i++){ a[i]=2*(tt[i]+tt[i+1]); b[i]=tt[i+1]; c[i]=tt[i]; dx[i]=3*(tt[i]*(x[i+1]-x[i])/tt[i+1]+tt[i+1]*(x[i]-x[i-1])/tt[i]); dy[i]=3*(tt[i]*(y[i+1]-y[i])/tt[i+1]+tt[i+1]*(y[i]-y[i-1])/tt[i]); } dx[1]=dx[1]-tt[2]*px[0]; dx[n-2]=dx[n-2]-tt[n-2]*px[n-1]; dy[1]=dy[1]-tt[2]*py[0]; dy[n-2]=dy[n-2]-tt[n-2]*py[n-1]; //注意,这是n=3的情况专有计算 px[1]=dx[1]/a[1]; py[1]=dy[1]/a[1]; break; default: for(i=1;i<n-1;i++) { a[i]=2*(tt[i]+tt[i+1]); b[i]=tt[i+1]; c[i]=tt[i]; dx[i]=3*(tt[i]*(x[i+1]-x[i])/tt[i+1]+tt[i+1]*(x[i]-x[i-1])/tt[i]); dy[i]=3*(tt[i]*(y[i+1]-y[i])/tt[i+1]+tt[i+1]*(y[i]-y[i-1])/tt[i]); } dx[1]=dx[1]-tt[2]*px[0]; dx[n-2]=dx[n-2]-tt[n-2]*px[n-1]; dy[1]=dy[1]-tt[2]*py[0]; dy[n-2]=dy[n-2]-tt[n-2]*py[n-1]; c[1]=c[1]/a[1]; for(i=2;i<n-1;i++) { a[i]=a[i]-b[i]*c[i-1]; c[i]=c[i]/a[i];} qx[1]=dx[1]/a[1]; qy[1]=dy[1]/a[1]; for(i=2;i<n-1;i++) {qx[i]=(dx[i]-b[i]*qx[i-1])/a[i]; qy[i]=(dy[i]-b[i]*qy[i-1])/a[i]; } px[n-2]=qx[n-2]; py[n-2]=qy[n-2]; for(i=n-3;i>=1;i--) {px[i]=qx[i]-c[i]*px[i+1]; py[i]=qy[i]-c[i]*py[i+1]; } break; } for(i=0;i<n-1;i++) { bx3=(3*(x[i+1]-x[i])/tt[i+1]-2*px[i]-px[i+1])/tt[i+1]; bx4=((2*(x[i]-x[i+1])/tt[i+1]+px[i]+px[i+1])/tt[i+1])/tt[i+1]; by3=(3*(y[i+1]-y[i])/tt[i+1]-2*py[i]-py[i+1])/tt[i+1]; by4=((2*(y[i]-y[i+1])/tt[i+1]+py[i]+py[i+1])/tt[i+1])/tt[i+1]; t=0; while(t<tt[i+1]) { t=t+es; cx=x[i]+(px[i]+(bx3+bx4*t)*t)*t; cy=y[i]+(py[i]+(by3+by4*t)*t)*t; px2=(int)cx; py2=(int)cy; myGraphics.drawLine(px1,py1,px2,py2); px1=px2; py1=py2;} } 3 样图展示 参考文献: 〔1〕孙正兴(计算机图形学教程[M](机械工业出版社,2006( 〔2〕(美)Peter Shirley.计算机图形学[M].人民邮电出版社,2007( 〔3〕百度文库.JAVA 2D高级绘图.
本文档为【利用java语言对三次样条曲线的实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_482581
暂无简介~
格式:doc
大小:17KB
软件:Word
页数:4
分类:
上传时间:2018-05-21
浏览量:24