✅ 操作成功!

贝塞尔曲线

发布时间:2023-06-17 作者:admin 来源:文学

贝塞尔曲线

贝塞尔曲线

游香山-上海人力资源和社会保障自助经办平台

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]);

}

}

}

👁️ 阅读量:0