常规运动2

第二篇主要实现正弦、平抛、自由落体、贝塞尔曲线运动。

使用的样式、注意事项与常规1相同。

正弦运动

  • 根据公式 s=sin(α)
  • 角度α是唯一参数,通过定时器来更新角度
  • 运动距离α>2PI 运动结束,清除定时器clearInterval(timer)*
  • sin的值域为[-1,1],展示效果不明显,对横纵坐标值都进行了增幅
    var α = 0,
    	addN = 20,
    	x,y,
    	timer = null;
    sin();
    function sin(){
    	timer = setInterval(function(){
    		α+=0.05;
    		y = addN*Math.sin(α);
    		x = addN*α;
    		if(α > Math.PI*2) clearInterval(timer);
    		ball.style.transform = 'translate('+ x+'px,'+y+'px)';
    		createDom(x,y);
    	})
    }
复制代码

正切运动

  • 根据公式 s=tan(α)
  • 角度α是唯一参数,通过定时器来更新角度
  • 运动距离α>2PI 运动结束,清除定时器clearInterval(timer)*
  • tan的值域为[-∞,+∞],无穷大不好展示,对横纵坐标值都进行了增幅并对纵坐标的最大值做了限制
    var α = 0,
    	addN = 20,
    	x,y,
    	timer = null;
    	tan();
    function tan(){
    	timer = setInterval(function(){
    		α+=0.01;
    		y = addN*Math.tan(α);
    		x = addN*α;
    		if(α > Math.PI*2) clearInterval(timer);
    		if(Math.abs(y)>90) return; //人为设定最大值
    		ball.style.transform = 'translate('+ x+'px,'+y+'px)';
    		createDom(x,y);
    	})
    }
复制代码

自由落体运动

  • 根据公式 s=Vot + gt²/2
  • 假定坐标原点为0点
  • g,Vo为常量,s为只与t有关的2次函数
  • 运动距离 s>Sa 运动结束,清除定时器clearInterval(timer)
  • 特殊的匀加速运动
    var t =0,//时间
    	g = 5,//加速度
    	Vo = 0,//初速度
    	s=0,//位置
    	timer = null,//保存计时器
    	ballR = 10,//球半径
    	Sa = 300;//下落距离
    
    drop();
    function drop(){
    	timer = setInterval(function(){
    		t+=0.05;
    		s = Vo*t + 0.5*g*t*t;//距离公式
    		ball.style.transform = 'translate(0px,'+s+'px)';//位移
    		createDom(ballR/4,s)
    		if(s>Sa-ballR) {
    			clearInterval(timer);
    		}
    	})
    }
复制代码

平抛运动

  • 根据公式 s=Vxt + gt²/2
  • 运动分解为水平和垂直方向,水平防线为初速度为Vx的匀速直线运动,垂直方向为初速度为0的匀加速运动
  • 假定坐标原点为0点
  • g,Vo为常量,s为只与t有关的2次函数
  • 运动距离 Sy>300 运动结束,清除定时器clearInterval(timer)
  • 平抛运动=匀速直线运动+自由落体运动
    var Vx = 10,
    	t = 0,
    	g = 2,
    	Sx,Sy,
    	timer = null;
    	flatThrow();
    function flatThrow(){
    	timer = setInterval(function(){
    		t+=0.1;
    		Sx = Vo*t;
    		Sy = 0.5*g*t*t;
    
    		ball.style.transform = 'translate('+ Sx+'px,'+Sy+'px)';
    		createDom(Sx,Sy);
    		if(Sy>300-10){
    			clearInterval(timer);
    		}
    	})
    }
复制代码

贝塞尔曲线

  • 以上为贝塞尔1-N阶曲线的公式
  • 根据以上公式可以理解为起始点、控制点、结束点的向量关系,是特殊的曲线运动
  • 将向量拆分成x,y两个值,分别带入求解,即为对应该时间点t的坐标位置
  • x,y为最高项为t的N阶函数
  • P0为起点,P3为终点,P1,P2为控制点
  • 运动距离 Sy>300 运动结束,清除定时器clearInterval(timer)
    var P0 = [0,0],
    	P1 = [134, -100],
    	P2 = [177, 145],
    	P3 = [0, 250],
    	time = 0,
    	timer = null;
    function getSigle(x1,x2,x3,x4,t){
    	return x1*(1-t)*(1-t)*(1-t) + 3*x2*t*(1-t)*(1-t) + 3*x3*t*t*(1-t) + x4*t*t*t;
    }
    function getPoint(p0,p1,p2,p3,t){
    	 var x = getSigle(p0[0],p1[0],p2[0],p3[0],t);
    	 var y = getSigle(p0[1],p1[1],p2[1],p3[1],t);
    	 return [x,y];
    }
    bezierThi(P0,P1,P2,P3);
    function bezierThi(p0,p1,p2,p3,bool){
    	timer = setInterval(function(){
    		time+=0.005;
    		if(time>1) {
    			clearInterval(timer);
    		}
    		var position = getPoint(p0,p1,p2,p3,time);
    		var x = position[0];
    		var y = position[1];
    
    		ball.style.transform = 'translate('+ x+'px,'+y+'px)';
    		createDom(x,y);
    	});
    }
复制代码

总结

较为复杂运动只是普通运动特殊形式或组合;对特殊形式找规律,按规律求解;组合形式对运动拆解,分别处理;看似复杂的东西都是由基础部分构成,找出本质,列出流程,问题迎刃而解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值