Javascript 基于大小的舍入数和变化系数(数学/算法问题)
我目前正在编写一个工具,允许用户通过挤压屏幕来更改值。我使用Hammer.js捕捉夹点事件,并使用事件的Javascript 基于大小的舍入数和变化系数(数学/算法问题),javascript,algorithm,math,rounding,hammer.js,Javascript,Algorithm,Math,Rounding,Hammer.js,我目前正在编写一个工具,允许用户通过挤压屏幕来更改值。我使用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 fina
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;
}
}
});
这不起作用,因为它只是对数字进行四舍五入,随着数字变大,我实际上需要增加因子
有人能建议最好的方法吗?因为
标度
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;
}
如果(值>=2500){
数值+=500*刻度;
}
否则如果(值>=1000){
数值+=100*刻度;
}
否则如果(值>=200){
数值+=50*刻度;
}
否则如果(值>=60){
数值+=10*刻度;
}
否则如果(值>=30){
数值+=5*刻度;
}
否则{
数值+=刻度;
}
如果(值<0){
数值=0;
}
如果(值>=5000){
价值=5000;
}
(假设上限为
值=5000)。似乎您仍然需要舍入的数字(如果我错了,请更正我),因此,由于可能的值数量有限,您可以使用收缩事件修改的线性标度作为所需值的索引:
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);
}
});
var值=10;
var量表=10;
var-previous_scale=假;
按压打开(“按压”,功能(e){
//只有继续,这不是最后的接触
//最终触摸的刻度为(0)
如果(e.isFinal==false){
刻度=数学圆(刻度*e.scale);
如果(刻度<0){
//下限
数值=0;
}否则如果(刻度<31){
//1-->31值的0-30增量
数值=刻度;
}否则如果(刻度<37){
//5-->6个值的35-60增量
数值=30+(刻度-30)*5;
}否则如果(刻度<51){
//10-->14个值的70-200增量
数值=60+(刻度-36)*10;
}否则如果(刻度<67){
//50-->16个值的250-1000增量
数值=200+(刻度-50)*50;
}如果(标度<82){
//100-->15个值的1100-2500增量
数值=1000+(刻度-66)*100;
}否则,如果(刻度<87){
//500-->5个值的3000-5000增量
数值=2500+(刻度-81)*500;
}否则{
//上限
价值=5000;
}
console.log(值);
}
});
请告诉我这是否与你的想法相近
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);
}
});