js动画效果

<html><head>
        <style>
                div{background-color:#000;height:1px;width:1px;position:absolute;overflow:hidden;}
                span{background-color:red;height:20px;width:20px;position:absolute;overflow:hidden;}
        </style>
</head><body></body></html>
<script>
        //by x!ao_f 120000512
        var xp = [];
        var yp = [];
        var ind = 0;
        document.onmousedown = function(e) {
                e = window.event||e;
                xp[ind] = e.x||e.pageX;
                yp[ind] = e.y||e.pageY;
                if (ind == 0) {
                        ind++;
                        xp[ind] = e.x||e.pageX;
                        yp[ind] = e.y||e.pageY;
                }
                document.body.innerHTML = "";
                posData = [];
                BSPLine(xp, yp, ind, 10);
                ind++;
        }
        //拟合曲线算法
        function BSPLine(x,y,n,k) {
                var i, j;
                var t, t1, t2, a, b, c, tx, ty, sx, sy;
                x[0] = x[1];
                y[0] = y[1];
                x[n + 1] = x[n];
                y[n + 1] = y[n];
                t = 1.0 / k;
                sx = (x[0] + x[1]) / 2;
                sy = (y[0] + y[1]) / 2;
                for (i = 0; i < n; i++) {
                        for (j = 1; j < k; j++) {
                                t1 = j * t;
                                t2 = t1 * t1;
                                a = (t2 - 2 * t1 + 1) / 2;
                                b = t1 - t2 + 1 / 2;
                                c = t2 / 2;
                                tx = a * x[i] + b * x[i + 1] + c * x[i + 2];
                                ty = a * y[i] + b * y[i + 1] + c * y[i + 2];
                                Line(sx, sy, tx, ty);
                                sx = tx;
                                sy = ty;
                        }
                }
                Update();
        }
        //直线算法
        function Line(x0,y0,x1,y1){
                var ary = [];
                var tmp;
                var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0);
                var rev = false;
                if(steep){
                        tmp = x0; x0 = y0; y0 = tmp;
                        tmp = x1; x1 = y1; y1 = tmp;
                }
                if(x0 > x1){
                        tmp = x0; x0 = x1; x1 = tmp;
                        tmp = y0; y0 = y1; y1 = tmp;
                        rev = true;
                }
                var deltax = Math.abs(x1 - x0);
                var deltay = Math.abs(y1 - y0);
                var error = deltax / 2;
                var ystep;
                var y = y0;
                if(y0 < y1) ystep = 1; else ystep = -1;
                for(var x = x0; x <= x1; x++){
                        if(steep){
                                if(rev){
                                        ary.unshift(x);
                                        ary.unshift(y);
                                       
                                }else{
                                        ary.push(y);
                                        ary.push(x);
                                }
                        }else{
                                if(rev){
                                        ary.unshift(y);
                                        ary.unshift(x);
                                }else{
                                        ary.push(x);
                                        ary.push(y);
                                }
                        }
                        error = error - deltay;
                        if(error < 0){
                                y = y + ystep;
                                error = error + deltax;
                        }
                }
                for(var i=0;i<ary.length;i+=2){
                        Pos(ary[i],ary[i+1]);
                }
        }
        var cache = [];
        var posData = [];
        //像素点画到缓存
        function Pos(x,y){
                posData.push(x);
                posData.push(y);
                cache.push("<div style=left:");
                cache.push(x);
                cache.push("px;top:");
                cache.push(y);
                cache.push("px></div>");
        }
        //将路径显示到Body
        function Update(){
                document.body.innerHTML=cache.join("");
                if(posData.length>0){
                        cache = ["<span id=r style=left:",(posData[0]-10),"px;top:"+(posData[1]-10)+"px></span>"];
                }else{
                        cache = [];
                }
        }
        //按任意键执行动画
        var posind = 0;
        document.οnkeydοwn=function(e){
                var e = e||event
                if(e.keyCode==13){
                        document.οnmοusedοwn=null;
                        window.setInterval(function(){
                                if(posind<posData.length){
                                        r.style.left=parseInt(posData[posind++]-10)+"px";
                                        r.style.top=parseInt(posData[posind++]-10)+"px";
                                        posind+=2;
                                }
                        },1)
                }
        }
</script>

 

 

用法:

用鼠标点击画出轨迹,之后按ctrl+enter键播放

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值