2014-09-05 56 views
0

像大多数开发人员,我的数学技能是不够的甚少。划分滑块值到范围区段

我有值0到滑块〜和滑块的前半部分应通过标度为0-10运行而滑动件的第二半部应通过值运行11-〜。

的解决方案,我有很程序和看起来如下:

var sliderPercent = timeSlider.sliderPosition; 

// What number on the scale of 0 to hoursMax does our % equal? 
var position = (this.options.hoursMax/100) * sliderPercent; 

var newMin = 0; 
var newMax = 10 * 2; // new max is 20, so half way is 10. 

var oldRange = (this.options.hoursMax - this.options.hoursMin); 
var newRange = (newMax - newMin); // new range is 0-20 

if(sliderPercent > 50) { 
    newRange = (this.options.hoursMax + newMax - this.options.hoursMin); 
    position -= newMax; 
} 

var newValue = ((position * newRange)/oldRange); 

正如所有的东西,有肯定是一个更好的方法来做到这一点。涉及log和exp以及那些可爱的数学函数的东西。

这也将是很好,如果我可以很容易地分我的滑块与不同范围的部分。 Perpahs 50% - 75%将是11 - 50,最后一个50 - 。我在寻找如何建立更一般的解决方案的理解。

+1

你是什么意思的“〜”?我也觉得你不需要这个滑块的线性缩放比例(除非〜= 20),但我不能告诉你想要什么。 – 2014-09-05 14:03:55

+0

我使用〜来表示无穷大。 – 2014-09-05 14:04:55

+0

含义,一些任意的最终值。我们称之为60. – 2014-09-05 14:06:47

回答

0

如果我理解正确,你正在寻找一种方式来滑块到映射多个部分分成一个结果值。

I.e.像这样的东西可以用于线性范围:

// define sections as a sparse array holding slider ranges: 
var sections = []; 
sections[50] = 10;  // map [0, 50> to [0, 10> 
sections[60] = 20;  // map [50, 60> to [10, 20> 
sections[70] = 100;  // map [60, 70> to [20, 100> 
sections[80] = 500;  // map [70, 80> to [100, 500> 
sections[90] = 1000;  // map [80, 90> to [500, 1000> 
sections[100] = 10000; // map [90, 100> to [500, 1000> 

function mapPercentToValue(percent) { 

    var previousKey = 0; 
    var sectionStart = 0; 
    var sectionEnd = 0; 

    for (var key in sections) { 
     sectionEnd = sections[key]; 
     if (key >= percent) { 
      break; 
     } 
     sectionStart = sectionEnd; 
     previousKey = key; 
    } 

    return (percent - previousKey) 
     /(key - previousKey) 
     * (sectionEnd - sectionStart) + sectionStart; 
} 
+0

谢谢@Groo。从我最初的测试中,这正是我想要的。 – 2014-09-05 16:20:23

+0

我上文所提到的最大值是不相关的持有以及在这里,因为'节[100]'可以简单'= this.options.hoursMax'。感谢Groo。 – 2014-09-05 16:28:15