Javascript圆形滑块度数到时间

时间:2013-12-10 21:02:34

标签: javascript jquery math

我正在看这个滑块http://jsfiddle.net/sCanr/1/

(function () {
    var $container = $('#container');
    var $slider = $('#slider');
    var sliderW2 = $slider.width()/2;
    var sliderH2 = $slider.height()/2;    
    var radius = 200;
    var deg = 0;    
    var elP = $('#container').offset();
    var elPos = { x: elP.left, y: elP.top};
    var X = 0, Y = 0;
    var mdown = false;
    $('#container')
    .mousedown(function (e) { mdown = true; })
    .mouseup(function (e) { mdown = false; })
    .mousemove(function (e) {
        if (mdown) {
           var mPos = {x: e.clientX-elPos.x, y: e.clientY-elPos.y};
           var atan = Math.atan2(mPos.x-radius, mPos.y-radius);
           deg = -atan/(Math.PI/180) + 180; // final (0-360 positive) degrees from mouse position 

           X = Math.round(radius* Math.sin(deg*Math.PI/180));    
           Y = Math.round(radius*  -Math.cos(deg*Math.PI/180));
           $slider.css({ left: X+radius-sliderW2, top: Y+radius-sliderH2 });              
           // AND FINALLY apply exact degrees to ball rotation
           $slider.css({ WebkitTransform: 'rotate(' + deg + 'deg)'});
           $slider.css({ '-moz-transform': 'rotate(' + deg + 'deg)'});
           //
           // PRINT DEGREES               
           $('#test').html('angle deg= '+deg); 
        }
    });

})();

我想做什么把它变成html5视频的时间线控制。但是,我在计算这背后的数学时遇到了一些麻烦。

1 个答案:

答案 0 :(得分:0)

试试这个:

http://jsfiddle.net/phdphil/Zv4K7/#base

它的工作原理是保持当前位置和最后角度的全局变量(您应该更改此设置以构建具有自己状态的特定拨号)。然后,每个运动计算Δ(模360,其需要适当的模数函数)并假设< 180度是向前移动,并且> 180度(记住-1模数360是359)是负运动。然后,这会更新累计总位置:

var current = 0;
var lastAngle = 0;

           // ... inside the handler
           var delta = 0;
           var dir = 0;
           var rawDelta = mod(deg-lastAngle,360.0);
           if(rawDelta < 180) {
              dir = 1;
              delta = rawDelta;
           } else {
              dir = -1;
              delta = rawDelta-360.0;
           }
           current += delta;
           lastAngle = deg;
           $('#test').html('angle deg= '+current);  // current instead of deg

为了清楚起见,dir变量保留了此移动的方向,可用于更新&gt;&gt;或&lt;&lt;屏幕上的指示灯。

实模数函数取自this SO answer

function mod(x,n) {
   return ((x%n)+n)%n;
}