minTan +

canvas实现小球的抛物线运动

看了一篇面经里面有道题是js实现小球沿抛物线运动;初看觉得挺简单的,就随手敲了一下;然而问题多多啊。。。。

1.canvas画出抛物线:

     // 获取canvas
     var canvas = document.getElementById('pao');
     // 由canvas获取 绘图的上下文
     var ctx =canvas.getContext('2d');
     // context.quadraticCurveTo(cpx,cpy,x,y)  二元抛物线
     // 参数
     // cpx 	贝塞尔控制点的 x 坐标
     // cpy 	贝塞尔控制点的 y 坐标
     // x 	结束点的 x 坐标
     // y 	结束点的 y 坐标
     // context.bezierCurveTo(cpx1,cpy1,cpx2,cpy2,x,y)  三元抛物线
     // 参数:
     // cp1x 第一个贝塞尔控制点的 x 坐标
     // cp1y 第一个贝塞尔控制点的 y 坐标
     // cp2x 第二个贝塞尔控制点的 x 坐标
     // cp2y 第二个贝塞尔控制点的 y 坐标
     ctx.beginPath();//路径开始
     ctx.moveTo(0,0);//开始点
     ctx.quadraticCurveTo(100,200,200,0);
     ctx.strokeStyle = "#0000ff";//线条颜色
     ctx.lineWidth =2;//指定线条宽度
     ctx.stroke();

image

2.js控制小球的位置:

主要想法是去控制小球的topleft;实现小球运动

难点在抛物线和小球运动轨迹的重合(这点我还没有折腾清楚这周末前弄明白);

老是想偷懒用quadraticCurveTo去画抛物线结果小球运动的抛物线(也就是二阶贝尔赛曲线并不好求表达式)于是:

   // 2.获取canvas duix
   var canvas = document.getElementById('pao');
   // 3.由canvas获取 绘图的上下文
   var ctx = canvas.getContext('2d');
   paowu(ctx);
   function paowu(context) {
       context.strokeStyle = "#0000ff";
       context.lineWidth = 2;
       for (let i = 0; i < 240; i++) {
            context.lineTo(i, -i * i/46 + 3.4 * i);
       }
            context.stroke();
   };

控制小球运动:

 setInterval(play,800);
 var x=0,y=0;
 function play(){
    var moving = document.getElementById("toll");
       if(x<240&&y<200){
            x+=1;y=-x * x/46 + 3.4 * x;
            moving.style.top = y+"px";
            moving.style.left = x+"px";
       }else{
             x=0;
             y=0;
       }
 }

image

点击查看评论

Money

Life