方法一:转自yihandk666
x=[0 0.1 0.16 0.27 0.41 0.48 0.59 0.8]
y=[5 9 70 118 100 17 0 5]
那么用plot画出的函数为折线,如下图:
要想把那个折点平滑掉。像论文中那样,具体采用样条函数:下面是样条函数的定义:
spline function 一类分段(片)光滑、并且在各段交接处也有一定光滑性的函数。简称样条。样条一词来源于工程绘图人员为了将一些指定点连接成一条光顺曲线所使用的工具,即 富有d性的细木条或薄钢条。由这样的样条形成的曲线在连接点处具有连续的坡度与曲率。分段低次多项式、在分段处具有一定光滑性的函数插值就是模拟以上原理 发展起来的,它克服了高次多项式插值可能出现的振荡现象,具有较好的数值稳定性和收敛性,由这种插值过程产生的函数就是多项式样条函数。
大概意思就是让转折点变平滑,下面就是采用这种方式:
values = spcrv([[x(1) x x(end)][y(1) y y(end)]],3)
plot(values(1,:),values(2,:))
具体里面的原理我也没看过,不过目的是达到了 下面是结果
方法二:转自greatdju
figure:
x1=[0.8395 0.7995 0.7895 0.7867 0.7857 0.7853 0.7847 ]
y1=[1.11E-01 4.64E-02 1.19E-03 1.77E-04 1.57E-05 3.45E-06 2.55E-07 ]
subplot(1,2,1)
semilogy(x1,y1) %原来的折线
title('左边:原来的折线')
x2=linspace(min(x1),max(x1))
y2=interp1(x1,y1,x2,'cubic')
subplot(1,2,2)
semilogy(x2,y2) %处理后的曲线
title('右边:处理后的曲线')
去这里看看!!http://wenku.baidu.com/view/dc4d1c40a8956bec0975e3b2.htmlMATLAB中样条函数命令
B样条函数
splst显示生成B样条函数的M文件
spmak生成B样条函数
spcrv生成均匀划分的B样条函数
spapi插值生成B样条函数
spap2用最小二乘法拟合生成B样条函数
spaps对生成的B样条曲线进行光滑处理
spcol生成B样条函数的配置矩阵
三次样条函数
函 数描述
csapi 插值生成三次样条函数
csape 生成给定约束条件下的三次样条函数
csaps 平滑生成三次样条函数
cscvn 生成一条内插参数的三次样条曲线
getcurve 动态生成三次样条曲线
分段多项式样条函
pplst 显示关于生成分段多项式样条曲线的M文件
ppmak 生成分段多项式样条函数
ppual 计算在给定点处的分段多项式样条函数值
有理样条函数
rpmak 生成有理样条函数
rsmak 生成有理样条函数
*** 作样条函数
fnval 计算在给定点处的样条函数值
fmbrk 返回样条函数的某一部分(如断点或系数等)
fncmb 对样条函数进行算术运算
fn2fm 把一种形式的样条函数转化成另一种形式的样条函数
三次B样条曲线的C实现关键词: C++
三次B样条曲线的C实现
三次B样条曲线是分段参数的多项式曲线结合起来的,亦用分段的形式去表现
建立[CD,PCD]的绘制空间
File→new→Project→MFC AppWizard[exe] →Singer→Finish
然后在classview找到Cmyview→OnDarw[CDC*pDC]双击就ok
在起对应的位置加上以下语句:
void XXXTView::OnDraw(CDC* pDC) //XXX为C文件名
{
XXXTDoc* pDoc = GetDocument()
ASSERT_VALID(pDoc)
// TODO: add draw code for native data here
Static long p[N+3][2]={50,400,100,120,260,180,500,120,600,300,590,420,50,400,100,120,260,180}
int i
pDC->MoveTo(p[0][0],p[0][1])
for(i=1iLineTo(p[i][0],p[i][1])
B3_curves('p',p,N-1,0,0,pDC)
// pDC->SelectObject(oldPen2)
/*
//插值端点条件三次B样条曲线
p[0][0]=6.0*p[0][0]-4.0*p[1][0]-p[2][0]
p[0][1]=6.0*p[0][1]-4.0*p[1][1]-p[2][1]
p[N-1][0]=6.0*p[N-1][0]-4.0*p[N-2][0]-p[N-3][0]
p[N-1][1]=6.0*p[N-1][1]-4.0*p[N-2][1]-p[N-3][1]
CPen newPen(PS_SOLID,1,RGB(0,0,255))
CPen *oldPen=pDC->SelectObject(&newPen)
B3_curves('p',p,N-1,0,0,pDC)
pDC->SelectObject(oldPen)*/
/*
//周期边界条件三次B样条曲线
p[0][0]=50
p[0][1]=400
p[N-1][0]=590
p[N-1][1]=420
CPen newPen1(PS_SOLID,1,RGB(255,0,0))
CPen *oldPen1=pDC->SelectObject(&newPen1)
B3_curves('p',p,N+2,0,0,pDC)
pDC->SelectObject(oldPen1)*/
}
void XXXTView::B3_curves(char pflag,long xq[][2],int m,long lxx,long lyy,CDC*pDC)
{
XXXTDoc* pDoc = GetDocument()
ASSERT_VALID(pDoc)
int i,j,k=10
long lx1,ly1
double t0,t1,t2,t3
lx1=(xq[0][0]+4.0*xq[1][0]+xq[2][0])/6+lxx
ly1=(xq[0][1]+4.0*xq[1][1]+xq[2][1])/6+lyy
if(pflag=='p')pDC->MoveTo(lx1,ly1)
for(i=1i
for(j=0j<=kj++)
{
CPen newPen2(PS_SOLID,i,RGB(80*i,50*i,10*i))
CPen *oldPen2=pDC->SelectObject(&newPen2)
//用不同颜色表现出6个顶点所绘制的三段曲线而构成的B样条曲线
//其中i为颜色的粗度,RGB内数据为颜色设置
t3=1.0*j/k
t0=1-t3
t0=t0*t0*t0/6.0
t1=((3.0*t3-6.0)*t3*t3+4.0)/6.0
t2=(((3-3*t3)*t3+3)*t3+1)/6.0
t3=1.0-t0-t1-t2
lx1=xq[i-1][0]*t0+xq[i][0]*t1+xq[i+1][0]*t2+xq[i+2][0]*t3+lxx
ly1=xq[i-1][1]*t0+xq[i][1]*t1+xq[i+1][1]*t2+xq[i+2][1]*t3+lyy
if(pflag=='p')pDC->LineTo(lx1,ly1)
}
}
又多了一招,在此环境下实现颜色
哦耶…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)