簡體   English   中英

根據大小四舍五入數字和更改因子(數學/算法問題)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM