canvas中的曲线运动

一 :曲线运动

   实现曲线运动的方法目前了解到两种:一种是三角函数,另一种是贝塞尔曲线,在这里我就介绍下如何用三角函数实现曲线运动。

三角函数相信大家在高中都有接触过,比如 正弦、余弦、正切等。这里我就简单介绍下正弦函数的运动轨迹。

 正弦函数图像
QQ截图20160826192452.jpg

如图所示的正弦函数就是一种曲线运动,那么如何能让一个物体能实现这种运动呢?

一:从图中可看出X轴代表的是弧度,Y轴代表的sin(弧度);

   那么弧度与角度是如何换算的?
      2π=360°;
     1°=2π/360°=π/180°;
     1弧度=180°/π;

二: 创建一个Div做为做曲线运动的对象

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
  <style>
    #div{width:10px;height:10px;background: red;position: absolute;top:500px;left:200px;}
.box{position: absolute;border: 1px solid #000;}
  </style>
<body>
  <div id="div"></div>
</body>
</html>

三:用js去控制这个Div的left值和top值

 <script>
      window.onload=function(){


     var oDiv=document.getElementById('div');
     var startX=oDiv.offsetLeft;
     var startY=oDiv.offsetTop;
     var num=0;
     var count=100;
     setInterval(function(){

         num++
        //count用来放大运动的轨迹
        //num*Math.PI/180 代表弧度
         oDiv.style.left=startX+0.5*(num*Math.PI/180)*count+'px';
         oDiv.style.top=startY-2*Math.sin(num*Math.PI/180)*count+'px';
         var oDiv1=document.createElement('div');
         oDiv1.className='box';
         oDiv1.style.left=oDiv.offsetLeft+'px';
         oDiv1.style.top=oDiv.offsetTop+'px';
         document.body.appendChild(oDiv1);

     },10);

      }
  </script>

曲线运动效果示意图

move.gif

四:如何让多物体做曲线运动

```

<script type="text/javascript">
window.onload=function(){

     var oC=document.getElementById('c');
     var oGC=oC.getContext('2d');


     var setArr=[];  //存储圆心坐标  半径  颜色等数据,以json的形式存储数据  

     setInterval(function(){

       oGC.clearRect(0,0,oC.width,oC.height);

       for(var i=0;i<setArr.length;i++){
         //通过改变圆心的坐标来实现曲线运动
          setArr[i].num++;
          setArr[i].X=setArr[i].startX -2*Math.sin(setArr[i].num*Math.PI/180)*setArr[i].step;
          setArr[i].Y=setArr[i].startY- 3*(setArr[i].num*Math.PI/180)*setArr[i].step;
          if(setArr[i].Y<100){
          setArr.splice(i,1);
  }
}

       for( var i=0;i<setArr.length;i++){
         oGC.fillStyle = 'rgba('+setArr[i].c1+','+setArr[i].c2+','+setArr[i].c3+','+setArr[i].c4+')';
         oGC.beginPath();
         oGC.moveTo(setArr[i].X,setArr[i].Y);
          oGC.arc(setArr[i].X,setArr[i].Y,setArr[i].R,0,360*Math.PI/180);
         oGC.closePath();
         oGC.fill();

       }


     },1000/60);


     setInterval(function(){

       var x=Math.random()*oC.width;
       var y=oC.height-10;
       var r=Math.random()*6+2;
       var c1 = Math.round(Math.random()*255);
       var c2 = Math.round(Math.random()*255);
       var c3 = Math.round(Math.random()*255);
       var c4 = 1;
       var step=Math.random()*20+10;
       var num=0;
       var startX=x;
       var startY=y;

      setArr.push({
     
         X:x,
         Y:y,
         R:r,
         c1:c1,
         c2:c2,
         c3:c3,
         c4:c4,
         num:num,
         step:step,
         startX:x,
         startY:y


      });

     },100);




  }

</script>
```

效果示意图

canvas.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上次给大家分享了《2017年最全的excel函数大全8—文本函数(下)》,这次分享给大家数学和三角函数(上)。 A...
    幸福的耗子阅读 1,547评论 0 1
  • 一、傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚...
    constant007阅读 4,493评论 1 10
  • 18日小鹿来北京~ 中午吃了部队锅,做指甲,下午去隐泉日料~(点的清汤蔬菜锅,青花鱼,寿司) 19日 上午燕麦香蕉...
    mariella阅读 172评论 0 1
  • 1、栅格化; 说明:栅格化是将cell中的所有内容生成一张独立的图像注意:必须指定分辨率,否则默认使用 *1 生成...
    冀F旭阅读 287评论 0 0
  • 字是打门锤。一笔好字,一门艺术,一生修养。 乐学堂书法班老师由贵州省书法家协会会员,贵阳市艺术研究院特聘书法家,贵...
    2dbd67f8c77a阅读 998评论 0 0