资源描述:
《优化了的过关键点的光滑曲线拟合算法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、优化了的过关键点的光滑曲线拟合算法作者:中国论坛网收集来源:http://www.51one.net加入时间:2004-8-25这个是我一个数学老师(教授,数学高手,经常自己做算法)给我的例子,用于多个离散点拟合光滑曲线的,他优化了追赶法,这个例子适用于闭合和不闭合两种情况。当时由于工程情况,写的急,代码不好看,但是很好用。为了方便传递参数,我做了一个链表,用时候根据自己情况可以修改,核心算法不动即可。classCFoldPoint{public: doubleX; doubleY;};typedefCTypedPtrListCFoldPointList;ty
2、pedefCArrayCDoubleArray;三个函数,SPLine调用另外两个。用时候直接调用SPLine函数,入口pList是已知离散点链表,pDestList是生成的点的链表。SM是在两个点中间插入点的数目,continue=0是采样点无规律,要求生成闭合曲线。1是采样点x坐标连续2是y连续voidZG(CDoubleArray*A,CDoubleArray*B,CDoubleArray*C,CDoubleArray*G,int&LOGI){ //追赶法 registerlongI; intN; N=A->GetSize(); if(LOGI==0) { (
3、*C)[0]=(*C)[0]/(*B)[0]; for(I=1;I { (*B)[I]=(*B)[I]-(*A)[I]*(*C)[I-1]; (*C)[I]=(*C)[I]/(*B)[I]; } (*A)[0]=0.; (*C)[N-1]=0.; LOGI=1; } (*G)[0]=(*G)[0]/(*B)[0]; for(I=1;I { (*G)[I]=((*G)[I]-(*A)[I]*(*G)[I-1])/(*B)[I]; } for(I=N-2;I>-1;I--)//DO30I=N-1,1,-1 { (*G)[I]=(*G)[I]-(*C
4、)[I]*(*G)[I+1]; } return;}voidSPLine4(CDoubleArray*X,CDoubleArray*Y,double&XI,double&YI,CDoubleArray*A,CDoubleArray*B,CDoubleArray*C,CDoubleArray*G,int&LOGI,intMD){ registerlongI; doubleW1,W2,H; intN=X->GetSize(); if(LOGI==0) { for(I=1;I { (*B)[I]=(*X)[I]-(*X)[I-1]; (*C)[I]=((*Y
5、)[I]-(*Y)[I-1])/(*B)[I]; } for(I=1;I { (*A)[I]=(*B)[I]+(*B)[I+1]; (*G)[I]=6.*((*C)[I+1]-(*C)[I])/(*A)[I]; (*A)[I]=(*B)[I]/(*A)[I]; } for(I=1;I { (*C)[I]=1.-(*A)[I]; (*B)[I]=2.; } (*B)[0]=2.; (*B)[N-1]=2.; if(MD==3) { (*C)[0]=-1.; (*A)[N-1]=-1.; (*A)[0]=0.; (
6、*C)[N-1]=0.; } ZG(A,B,C,G,LOGI); } for(I=1;I { if(XI>=(*X)[I-1]&&XI<=(*X)[I])//GELE { H=(*X)[I]-(*X)[I-1]; W1=(*X)[I]-XI; W2=XI-(*X)[I-1]; YI=W1*W1*W1*(*G)[I-1]/6./H; YI=YI+W2*W2*W2*(*G)[I]/6./H; YI=YI+W1*((*Y)[I-1]-(*G)[I-1]*H*H/6.)/H; YI=YI+W2*((*Y)[I]-(*G)[I]*H*H/6.
7、)/H; } }}voidSPLine(CFoldPointList*pList,CFoldPointList*pDestList,intSM,intContinue=0){ CFoldPoint*pFoldHead,*pFoldTail; POSITIONpos; CDoubleArrayA,B,C,G,X,Y,T; doubleXI,YI,XX,YY; registerlongi; longN; intLOGI; longRealSM; longBei,Yu; CFoldPoint*pFold; file://赋初值 N=pList->GetC