2016-01-13 45 views
0

我目前正在編寫一個工具,允許用戶通過捏他們的屏幕來更改值。我正在使用Hammer.js來捕捉夾點事件,並使用事件的scale屬性來確定要更改該值的因素。基於大小舍入數字和更改因子(數學/算法問題)

下面的代碼演示如何,我增加以及基於捏降低值:

var value = 10; 
var scale = false; 
var previous_scale = false; 

pinch.on("pinch", function(e){ 
    // Only proceed is it is not the final touch 
    // The final touch has a scale of (0) 
    if(e.isFinal===false){ 
     // Only proceed if the previous scale has been defined 
     if(previous_scale!==false){ 
      // Calculate the difference in scales 
      scale = e.scale-previous_scale; 
      previous_scale = e.scale; 
      if(scale>0){ 
       value = Math.round(value+(1+(scale*100))); 
       value = value>=4000 ? 4000 : value; 
      }else{ 
       value = Math.round(value-(1+(Math.abs(scale)*100))); 
       value = value<=10 ? 10 : value; 
      } 
      console.log(value); 
     }else{ 
      previous_scale = e.scale; 
     } 
    } 
}); 

我的問題是,我想value做到以下幾點:

  • value小於30,每個刻度增加1
  • value小於60時,每個刻度增加5
  • value大於200,增量爲每個尺度
  • 少由10當value大於1000,增量少50爲每個尺度
  • value小於2500,增量100爲每個尺度
  • value小於5000,由500爲每個尺度遞增

我曾嘗試通過將下列實現上述:

if(radius>2000){ 
    radius = 500*Math.round(radius/500); 
}else if(radius>1000){ 
    radius = 100*Math.round(radius/100); 
}else if(radius>300){ 
    radius = 50*Math.round(radius/50); 
}else if(radius>50){ 
    radius = 10*Math.round(radius/10); 
} 

這不起作用,因爲它只是四捨五入數字,我實際上需要增加因數隨着數字變大。

任何人都可以建議最好的方法來做到這一點?

回答

0

由於scale變種是已經增量,這似乎是非常簡單的:

if(value >= 2500) { 
    value += 500 * scale; 
} 
else if(value >= 1000) { 
    value += 100 * scale; 
} 
else if(value >= 200) { 
    value += 50 * scale; 
} 
else if(value >= 60) { 
    value += 10 * scale; 
} 
else if(value >= 30) { 
    value += 5 * scale; 
} 
else { 
    value += scale; 
} 

if(value < 0) { 
    value = 0; 
} 
if(value >= 5000) { 
    value = 5000; 
} 

(在value = 5000假設的帽)。

0

無論如何,你似乎需要圓形的數字(糾正我,如果我錯了),因爲有可能的數量有限的數量,你可以使用由捏事件修改的線性比例作爲索引期望的值:

var value = 10; 
var scale = 10; 
var previous_scale = false; 

pinch.on("pinch", function(e){ 
    // Only proceed is it is not the final touch 
    // The final touch has a scale of (0) 
    if(e.isFinal===false) { 
    scale = Math.round(scale * e.scale); 
     if (scale < 0) { 
      // lower bound 
      value = 0; 
     } else if (scale < 31) { 
      // 0-30 increment of 1  --> 31 values 
     value = scale; 
     } else if (scale < 37) { 
      // 35-60 increment of 5  --> 6 values 
      value = 30 + (scale - 30) * 5; 
     } else if (scale < 51) { 
      // 70-200 increment of 10  --> 14 values 
      value = 60 + (scale - 36) * 10; 
     } else if (scale < 67) { 
      // 250-1000 increment of 50 --> 16 values 
      value = 200 + (scale - 50) * 50; 
     } else if (scale < 82) {   
      // 1100-2500 increment of 100 --> 15 values 
      value = 1000 + (scale - 66) * 100; 
     } else if (scale < 87) { 
      // 3000-5000 increment of 500 --> 5 values 
      value = 2500 + (scale - 81) * 500; 
     } else { 
      // higher limit 
      value = 5000; 
     } 
     console.log(value); 
    } 
}); 

請告訴我,如果這是一個接近你的想法。