?? 阿克瑪擬合曲線.txt
字號:
OnMenuitem32780()
{ //阿克瑪擬合曲線
// TODO: Add your command handler code here
CClientDC cdc(this);
float p[20],m[20],_m1;
float x,y,u,v,t1,t2;
POINT pt[20];
int n,i,j;
n=5;
pt[0].x=pt[0].y=n;
pt[1].x=10;
pt[1].y=10;
pt[2].x=80;
pt[2].y=230;
pt[3].x=210;
pt[3].y=150;
pt[4].x=370;
pt[4].y=100;
pt[5].x=520;
pt[5].y=160;
for(i=1;i<=n;++i)
{
cdc.MoveTo(pt[i]);
cdc.LineTo(pt[i].x+5,pt[i].y);
cdc.MoveTo(pt[i]);
cdc.LineTo(pt[i].x-5,pt[i].y);
cdc.MoveTo(pt[i]);
cdc.LineTo(pt[i].x,pt[i].y+5);
cdc.MoveTo(pt[i]);
cdc.LineTo(pt[i].x,pt[i].y-5);
}
for(i=1;i<=n-1;++i)
m[i]=1.0f*(pt[i+1].y-pt[i].y)/(pt[i+1].x-pt[i].x);
m[0]=2.0f*m[1]-m[2];
_m1=2.0f*m[0]-m[1];
m[n]=2.0f*m[n-1]-m[n-2];
m[n+1]=2.0f*m[n]-m[n-1];
if(fabs(m[1]-m[2])<1E-6) t1=m[1];
else t1=(m[0]*fabsf(m[2]-m[1])+m[1]*fabsf(m[0]-_m1))/(fabsf(m[2]-m[1])+fabsf(m[0]-_m1));
for(i=1;i<=n-1;++i)
{
u=fabsf(m[i+2]-m[i+1]);
v=fabsf(m[i]-m[i-1]);
if(fabsf(u)<1E-6&&fabsf(v)<1E-6) t2=(m[i]+m[i+1])/2.0f;
else t2=(u*m[i]+v*m[i+1])/(u+v);
p[0]=1.0f*pt[i].y;
p[1]=t1;
p[2]=(3.0f*m[i]-2.0f*t1-t2)/(pt[i+1].x-pt[i].x);
p[3]=(t2+t1-2.0f*m[i])/((pt[i+1].x-pt[i].x)*(pt[i+1].x-pt[i].x));
t1=t2;
cdc.MoveTo(pt[i]);
for(x=1.0f*pt[i].x;x<=1.0f*pt[i+1].x;++x)
{
y=p[3];
for(j=2;j>=0;--j)
y=p[j]+y*(x-pt[i].x);
cdc.LineTo((int)x,(int)y);
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -