当前位置:首页 » 操作系统 » bezier曲线算法实现

bezier曲线算法实现

发布时间: 2023-07-10 02:41:52

① 史上最全的贝塞尔曲线(Bezier)全解(一):初识贝塞尔曲线

  作为一个有只志向的码农,除了知道一些基本的知识够自己努力搬砖以外,还应该get一些更炫酷的技能,用更优雅的姿势进行搬砖;想要实现一些十分炫酷的效果,贝塞尔曲线就必须进行一些研究了;最近一段时间,我对贝塞尔曲线进行了部分的研究,因此就打算写贝塞尔曲线系列的文章来记录自己的研究;

##规矩我都懂 !##

我明白,必须先上图,要不然大家都没兴趣看下去先看比较简单的,贝塞尔曲线的一阶和二阶的应用

  看到二阶的贝塞尔曲线有没有感觉很眼熟,没错,360的下火箭弹射时候的小弹弓,还有滑动控件的阴影提示;以前的时候很多小伙伴跟我说这要计算多少数据啊,完全没办法实现啊,现在有了贝塞尔曲线,可以很简单的实现这一个功能;

 不过完全不能这样满足啊,接下来还有更复杂一些的曲线  没错,这个就是三阶的使用,有没有感觉路线更加复杂,不过还好,使用贝塞尔去玩完全可以轻松实现;对了,还有一个心在沿着曲线移动,看到这里,小伙伴们肯定会想到满屏幕的心在飞的场景,放心,这个我也实现了,在接下来的文章里,我会一一进行讲解

 ##图片看完了,现在简单了解贝塞尔曲线 ##

Bézier curve(贝塞尔曲线)是应用于二维图形应用程序的数学曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的形状会发生变化。 1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。以下公式中:B(t)为t时间下 点的坐标;P0为起点,Pn为终点,Pi为控制点一阶贝塞尔曲线(线段):  

意义:由 P0 至 P1 的连续点, 描述的一条线段二阶贝塞尔曲线(抛物线):

 原理:由 P0 至 P1 的连续点 Q0,描述一条线段。由 P1 至 P2 的连续点 Q1,描述一条线段。由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。经验:P1-P0为曲线在P0处的切线。

三阶贝塞尔曲线:

         通用公式: 

利用贝塞尔曲线的这些特性,我们可以画出很多炫酷的曲线,所以贝塞尔曲线还是值得我们去研究学习的;##但是这些完全记不住啊!!! ##没关系,可以很负责的说,我也是!!!!!上面的曲线完全是来自[ http://blog.csdn.net/tianhai110/article/details/2203572 ] 所以,如果你的数学和我一样是体育老师教的,就忘记这些吧,跟我一起看看android中是实现一条贝塞尔曲线的,android已经帮我们实现好了,剩下的就需要我们进行简单使用,具体的使用,就看

[ 史上最全的贝塞尔曲线(Bezier)全解(二):Android中曲线的简单绘制 ] 

[ 史上最全的贝塞尔曲线(Bezier)全解(三):贝塞尔曲线实现满屏爱心 ]

中讲解最后附上源码: https://github.com/sangxiaonian/BezierIntroce.git

② 求二次贝塞尔曲线 算法实现

typedefstruct

{

floatx;

floaty;

}Point2D;

/*cp在此是四个元素的数组:

cp[0]为起点,或上图中的P0

cp[1]为第一控制点,或上图中的P1

cp[2]为第二控制点,或上图中的P2

cp[3]为结束点,或上图中的P3

t为参数值,0<=t<=1*/

Point2DPointOnCubicBezier(Point2D*cp,floatt)

{

floatax,bx,cx;floatay,by,cy;

floattSquared,tCubed;Point2Dresult;

/*计算多项式系数*/

cx=3.0*(cp[1].x-cp[0].x);

bx=3.0*(cp[2].x-cp[1].x)-cx;

ax=cp[3].x-cp[0].x-cx-bx;

cy=3.0*(cp[1].y-cp[0].y);

by=3.0*(cp[2].y-cp[1].y)-cy;

ay=cp[3].y-cp[0].y-cy-by;

/*计算t位置的点值*/

tSquared=t*t;

tCubed=tSquared*t;

result.x=(ax*tCubed)+(bx*tSquared)+(cx*t)+cp[0].x;

result.y=(ay*tCubed)+(by*tSquared)+(cy*t)+cp[0].y;

returnresult;

}

/*ComputeBezier以控制点cp所产生的曲线点,填入Point2D结构数组。

调用方必须分配足够的空间以供输出,<sizeof(Point2D)numberOfPoints>*/

voidComputeBezier(Point2D*cp,intnumberOfPoints,Point2D*curve)

{

floatdt;inti;

dt=1.0/(numberOfPoints-1);

for(i=0;i<numberOfPoints;i++)

curve[i]=PointOnCubicBezier(cp,i*dt);

}

热点内容
dota2卡尔脚本 发布:2025-03-17 21:11:27 浏览:69
应用市场网站源码 发布:2025-03-17 21:09:46 浏览:411
linux怎么挂载 发布:2025-03-17 21:08:23 浏览:895
疫情数据库 发布:2025-03-17 20:58:00 浏览:669
excel怎么破解密码 发布:2025-03-17 20:49:32 浏览:359
v10系统电脑怎么连接服务器 发布:2025-03-17 20:43:39 浏览:985
如何给应用设密码是什么 发布:2025-03-17 20:32:25 浏览:472
欢迎访问河南工业大学 发布:2025-03-17 20:31:40 浏览:17
fw源码 发布:2025-03-17 20:13:17 浏览:65
java培训机构排行 发布:2025-03-17 19:59:53 浏览:588