[英]Rounding numbers and Changing Factor based on size (math/algorithm issue)
我目前正在編寫一個工具,允許用戶通過捏住屏幕來更改值。 我正在使用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);
}
這沒有用,因為它只是四舍五入,實際上我需要隨着數字變大而增加系數。
誰能建議最好的方法嗎?
由於scale
var已經是一個增量,因此看起來非常簡單:
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)。
似乎您仍然需要四舍五入的數字(如果我錯了,請糾正我),因此,由於可能的值數量有限,您可以使用由pinch事件修改的線性比例來將其作為所需值的索引:
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);
}
});
請告訴我這是否接近您的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.