`
westice
  • 浏览: 114174 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

贝塞尔曲线生成算法

阅读更多

从网上搜集来的两控制点贝塞尔曲线生成法:

 

 

         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)

 

 

 

 

  • 大小: 14.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics