利用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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。