
贝塞尔曲线
游香山-上海人力资源和社会保障自助经办平台
2023年3月20日发(作者:西西河)⼆阶贝塞尔曲线(Béziercurve)
简介
⼆阶贝塞尔曲线,可以通过三个点,来确定⼀条平滑的曲线。在计算机图形学应该有讲。是图形开发中的重要⼯具。多阶不做介绍是因为当你会⽤
⼆阶的话,多阶就是⼀个多次迭代的过程
⼆阶Bézier
五阶Bézier
简单实现
原理
三线取等⽐部分
设p0到p1上的点为p
设p0到p1上的点为p
设p到p上的点为p
设rate()=线长2/线长1
rate(p0-p1,p0-p)=rate(p1-p2,p0-p)=rate(p-p,p-p)这⾥的点p的轨迹就是我们的光滑曲线
定⽐等分
再来讲⼀下如何取⼀条线的等⽐点吧
>这⾥要引⼊⼀个定⽐等分公式,计算⽅法如下,公式⼀个拉姆达(λ)只能计算两个等分点,拉姆达(λ)需要不断⾃⾝-2直到⼩于等于0来求得所有
的等分点
定⽐等分公式
c++代码
boolcmpUx(Point2f&p1,Point2f&p2){returnp1.x>p2.x;}
boolcmpDx(Point2f&p1,Point2f&p2){returnp1.x boolcmpUy(Point2f&p1,Point2f&p2){returnp1.y>p2.y;} boolcmpDy(Point2f&p1,Point2f&p2){returnp1.y voiddiscrete4smooth(Pointp1,Pointp2,vector&discrete_pt,intdiscrete){ boolisX=(p1.x-p2.x!=0); boolisUp=(isX?p1.x>p2.x:p1.y>p2.y); cout< if(discrete<1)return; Point2fpt1=p1; Point2fpt2=p2; Point2fpt1_next,pt2_next; vectortmp; _back(pt1); _back(pt2); for(inti=discrete;i>=1&&i!=-1;i-=2){ pt1_next.x=(pt2.x+i*pt1.x)/(1+i); pt1_next.y=(pt2.y+i*pt1.y)/(1+i); pt2_next.x=(pt1.x+i*pt2.x)/(1+i); pt2_next.y=(pt1.y+i*pt2.y)/(1+i); _back(pt1_next); _back(pt2_next); pt2=pt1_next; pt1=pt2_next; } if(isX){ if(isUp)sort((),(),cmpUx); elsesort((),(),cmpDx); } else{ if(isUp)sort((),(),cmpUy); elsesort((),(),cmpDy); } for(inti=0;i<();i++)discrete__back(tmp[i]); cout< } voidbezier(vectorpath,vector&path_smooth,intdiscrete){ Matrecover=smooth_(); for(inti=0;i<()-3;i++){ vectorp_list1,p_list2; Pointp1=path[i]; Pointp2=path[i+1]; Pointp3=path[i+2]; discrete4smooth(p1,p2,p_list1,discrete); discrete4smooth(p3,p2,p_list2,discrete); for(intj=1;j vectorres_list; discrete4smooth(p_list1[j],p_list2[p_()-j],res_list,discrete); path__back(res_list[j]); } } }