利用三点控制,生成一条平滑的曲线,具体解析看这个贝塞尔曲线扫盲html
贝塞尔曲线由三个点肯定,起始点P0,中间点(控制点)P1,和终点P2。肯定三个点以后,用canvas全部的quadraticCurveTo方法绘制二阶贝塞尔曲线,小球的运动路径就出现了。可是小球须要沿着曲线运动,小球的运动是一帧一帧的,每一帧处于不一样的点位置,因此须要计算出必定间隔的点坐标集合,而后根据集合,改变小球的位置坐标,从而达到小球沿曲线运动的效果。canvas
quadraticCurveTo方法是canvas自带的绘制贝塞尔二阶曲线公式,传入控制点和终点,画出曲线动画
function draw_curve(obj) { //绘制2次贝塞尔曲线 context.beginPath(); context.moveTo(obj.p0_x,obj.p0_y);/*开始点*/ context.quadraticCurveTo(obj.p1_x,obj.p1_y,obj.p2_x,obj.p2_y);/*前两个是控制点坐标xy,后两个是结束点坐标xy*/ context.strokeStyle = "#000"; context.stroke(); context.closePath(); }
咱们知道了三点,起始点P0,中间点(控制点)P1,和终点P2。code
二阶曲线公式为B(t) = (1-t)^2 P0 + 2(1-t)tP1+ t^2P2;htm
这里的t是从0到0.99的数,能够取间隔0.01递增blog
当t为0.05时候,曲线上面某点的坐标O(Ox,Oy)的计算为
Ox = (1-t)^2 P0x + 2(1-t)tP1x+ t^2P2x;
Oy = (1-t)^2 P0y + 2(1-t)tP1y+ t^2P2y;get
//利用贝塞尔曲线公式计算出曲线上某点坐标 function get_bezier_dot(t,obj){ var x = (1-t)*(1-t)*obj.p0_x + 2*t*(1-t)*obj.p1_x + t*t*obj.p2_x; var y = (1-t)*(1-t)*obj.p0_y + 2*t*(1-t)*obj.p1_y + t*t*obj.p2_y; return {x:x,y:y} }
function draw_ball(x,y) { context.beginPath(); context.fillStyle = '#00E5EE'; context.arc(x, y,30, 0, Math.PI * 2); context.fill(); context.stroke(); context.closePath(); }
draw_frame()
(1)传入t,计算出这个曲线t时刻的点坐标,利用贝塞尔二阶公式get_bezier_dot()
(2)绘制贝塞尔曲线用quadraticCurveTo()
(3)根据(1)获得的坐标点用context.arc()
画出此时的圆在canvas上面
(4)能够再画出坐标文字在图上context.fillText(text, x, y)
;io
(1)每隔必定时间间隔画一帧的内容setInterval()
(2)清空画布,清空上一帧的画布clearRect()
(3)传入t,计算出坐标O',根据O'的坐标位置画此帧的内容,即上面每帧的动画流程draw_frame()
(4)此时t增长0.01,当t>0.99的时候clearInterval()
(5)运动完成function