matlab中跟據點擬合方程灰常容易,直接使用polyfit函式就行了。c++貌似沒有直接擬合曲線的函式,在下不才,就用c++結合opencv的庫函式寫了個擬合曲線的函式。
#include
#include
#include
using namespace std;
//函式功能:根據vec中儲存的點的座標擬合曲線;
//vec為為儲存點座標的容器,index為儲存擬合好曲線的陣列,len既為擬合曲線的次數,也為陣列index的長度;
void fittingcurve(vectorvec,double *index,int len)
i++;
}cvmat xmat=cvmat(vec.size(),1,cv_64fc1,px);
cvmat ymat=cvmat(vec.size(),len,cv_64fc1,py);
cvmat *ytransposedmat=cvcreatemat(ymat.cols,ymat.rows,cv_64fc1);
cvtranspose(&ymat,ytransposedmat);//求ymat的轉置
double *a=new double [len*len];
for(int i=0;i
cvmat invmat1=cvmat(len,len,cv_64fc1,a);
cvgemm(ytransposedmat,&ymat,1,null,0,&invmat1,0);//ymat的轉置與ymat矩陣相乘
cvinvert(&invmat1,&invmat1,0);//求invmat的逆矩陣
double *b=new double [len];
for(int i=0;i
cvmat invmat2=cvmat(len,1,cv_64fc1,b);
cvgemm(ytransposedmat,&xmat,1,null,0,&invmat2,0);//求ymat的轉置矩陣與xmat矩陣相乘
cvgemm(ytransposedmat,&xmat,1,null,0,&invmat2,0);//求ytransposedmat矩陣與xmat 矩陣的乘積
cvmat indexmat=cvmat(len,1,cv_64fc1,index);
cvgemm(&invmat1,&invmat2,1,null,0,&indexmat,0);
cvreleasemat(&ytransposedmat);
delete a;
delete b;
delete px;
delete py;
}int main()
;int y=;
for (int i=0;i<16;i++)
double index[3];
fittingcurve(vec,index,3);
for (int i=0;i<3;++i)
return 0;
}
使用一組點畫出平滑的曲線
今天在專案中需要人臉上的點來勾勒出人臉的輪廓,我的想法是將要畫的點存入乙個陣列,使用了uibezierpath來連線每乙個點。但是這樣畫出來的圖是折線,顯得過於生硬。查了若干資料,後來終於在stackoverflow上找到了乙個很好的解決辦法。這個做法的原理其實是在每兩個點之間加入一些點,來使得兩個...
M Sort it 一組簡單一點的題目 三
大意 就是將輸入的數列進行公升序排列的過程中,相鄰的兩個兩兩交換的次數最少為多少 思路 這個題不能單純的用什麼冒泡啥的,顯然不行,而是求出其對應的逆序數的對數,求出之後,有多少對就是進行移動的最少的次數。這是因為對於逆序數的時候你可以先交換相鄰的逆序數,最後一定能讓不相鄰的逆序數變成相鄰,然後交換,...
通過程式設計的方式根據一組封閉的線繪製相同形狀的箍筋
很多的時候我們希望給revit的構件配筋,通過程式設計的方式可以將你用手工繪製的模型線轉化成箍筋。非常方便直觀。我們呼叫rebar.createfromcurves 函式來建立箍筋。函式定義如下 public static rebar createfromcurves document doc,re...