Skip to content

Instantly share code, notes, and snippets.

@303182519
Last active May 20, 2018 09:56
Show Gist options
  • Save 303182519/9f056d637983b37c1f5c to your computer and use it in GitHub Desktop.
Save 303182519/9f056d637983b37c1f5c to your computer and use it in GitHub Desktop.

从整一份代码的规划来看的话,就是所有的方法,变量都放在funParabola函数里面 好处的话,大家都知道,防止全局变量的污染。假如是我的话,我估计是采用define包装下,其实都差不多,他里面也通过return exports暴露了一个对象

var exports = {
		mark: function() { return this; },
		position: function() { return this; },
		move: function() { return this; },
		init: function() { return this; }
};

var moveStyle = "margin", testDiv = document.createElement("div");
//排除IE8-的
if ("oninput" in testDiv) {
	["", "ms", "webkit"].forEach(function(prefix) {
		var transform = prefix + (prefix? "T": "t") + "ransform";
		if (transform in testDiv.style) {
			moveStyle = transform;
		}
	});		
}

整一份代码基本上就是这样,剩下的那些,就是抛物线的计算了,根据抛物线的运算公式,就可以很简单得算出运动的轨迹 根据两点坐标以及曲率确定运动曲线函数(也就是确定a, b的值) 公式: y = axx + b*x + c;

做了两份demo: demo1:

<!doctype html >
<html>
<head>
    <meta charset="utf-8"/>
    <title>抛物线运动</title>
    <style>
        *{ margin: 0; padding: 0}    
        .box { width: 30px; height: 30px; border-radius: 50%; background: #000; position: absolute;}
        #element { top:100px; left: 100px;}
        #targer { top:500px; left: 600px;}
    </style>
</head>
<body>
    <input type="button" value="抛物线" onclick="test()"/>
    <div class="box" id="element"></div>
    <div class="box" id="targer"></div>
</body>
<script>
    function test(){
        var element=document.getElementById("element"),
            targer=document.getElementById("targer"),
            elementTop=100,
            elementLeft=100,
            timer=null,
            //斜率
            a=0.001,
            //X方向的速度
            v=5,
            x=0,
            y=0,
            //b的值
            b=(400-a*500*500)/500;

            timer=setInterval(function(){
                x+=v;
                element.style.left=elementLeft+x+"px";
                element.style.top=elementTop+(a*x*x+b*x)+"px"; 
                
                if(x>=500){
                    clearInterval(timer);
                }

            },50)
    }            
</script>
</html>

demo2

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <style type="text/css">
            *{padding:0;margin:0;} body{font-size:13px;padding:10px;} p{margin:2px;}
            .wrap{position:relative;width:580px;height:326px;margin:0 auto;border:1px
            solid #ccc;margin-top:50px;} 
			#fall{position:absolute;top:0;left:0;}
        </style>
    </head>
    
    <body>
        <h3>
            模拟重力状态下的抛物运动
        </h3>
        <p>
            横向初速度:
            <input id="Vx" type="text" value="1" />
            px/ms
        </p>
        <p>
            纵向初速度:
            <input id="Vy" type="text" value="-2" />
            px/ms
        </p>
        <p>
            重力加速度:
            <input id="a" type="text" value="0.0098" />
            px/平方ms
        </p>
        <p>
            (如果这个加速度是一个随时间变化的值,就能达到其他非匀加速运动的效果了。)
        </p>
        <p>
            单位时间:
            <input id="t" type="text" value="2" />
            (记录运动的时间间隔)
            <p>
                <input type="button" value="演示" onclick="demo(document.getElementById('Vx').value, document.getElementById('Vy').value, document.getElementById('a').value, document.getElementById('t').value)"
                />
            </p>
				<div id="fall">
                    <div class="box" id="element" style="position:absolute; left:20px; top:420px; width: 30px; height: 30px; border-radius: 50%; background: #000; "></div>
                </div>

            <div id="line" style="position:absolute; left:0; top:450px; width:900px; height:2px; background:#f00;"></div>
            <script type="text/javascript">
            
//假设是一个炮弹运动的话,重力加速度基本恒定了,g,0.0098
//已弹弹堂的游戏,有个力度的能力,代表横向速度Vx。假设为1
//假如斜率为60°,那么根据勾股定理,纵向速度Vy,为-2,因为根据页面的坐标要为反方向,才能向上,所以为负数
//时间T就是运动时间间隔
//假设目标经过原点(0,0),那么y=ax^2+bx,C为0



function demo(x, y, a, t) {

    var f = document.getElementById('fall');

	var Vx = x,
    Vy = parseInt(y),
    g = a,
    t = parseInt(t),
    h = 0,
    l = 0,
    Sx = 0,
    Sy = 0;

    var i = setInterval(function() {
        if (f) {
            Sx += Vx * t;
            l = Sx;
            Vy += g * t;
            h += Vy * t;

            f.style.left = l + 'px';
            f.style.top = h + 'px';
            if (h>=0) {
                //因为小数点的原因
                f.style.left = l + 'px';
				clearInterval(i);
			}
        }
    },
    t);
}
            </script>
    </body>

</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment