从网上搜集来的两控制点贝塞尔曲线生成法:
int n=controlPoint.size()-1; // vector<POINT>存储控制点
int i,r;
float u;
CvPoint *p=new CvPoint[n+1];
BezierPoint.clear();
//u的步长决定了曲线点的精度
for(u=0;u<=1;u+=0.01){
for(i=0;i<=n;i++)p[i]=controlPoint[i];
for(r=1;r<=n;r++){
for(i=0;i<=n-r;i++){
p[i].x=(1-u)*p[i].x+u*p[i+1].x;
p[i].y=(1-u)*p[i].y+u*p[i+1].y;
}
}
BezierPoint.push_back(p[0]);
}
delete [] p;
//到这里贝塞尔曲线生成完毕
for(int i = 0 ;i < BezierPoint.size();i++){
cvCircle(canva,BezierPoint[i],1,CV_RGB(0,0,255),1,8,0);
}
曲线前部分和直线p0-p1相切
曲线后部分和直线p2-p3相切
3次贝塞尔计算公式:
t : 0 ~ 1;
yt=1-t;
xt=p[m][0]*yt*yt*yt+3*p[m+1][0]*yt*yt*t+3*p[m+2][0]*yt*t*t+p[m+3][0]*t*t*t;
yt=p[m][1]*yt*yt*yt+3*p[m+1][1]*yt*yt*t+3*p[m+2][1]*yt*t*t+p[m+3][1]*t*t*t;
新点:(xt,yt)