JavaScript中的指数规范计算

JavaScript中的指数规范计算,javascript,math,Javascript,Math,我有一个小的JavaScript AJAX脚本,它可以以kbps或其他任何速度(比如MB/s)获得进度。现在我想添加一个仪表,以图形方式显示速度 我会有一个包含仪表设计的图像和另一个带有指针的图像。默认情况下,指针指向顶部-最低值为-120度,最高值为120度。但如果某人有1mb的连接,那就不好了,所以我需要添加一个指数计算 以下是价值观 0-1MB:-120度->90度 1-5MB:-90度->60度 5-10MB:-60度->30度 10-20MB:-30度->0度 20-30MB:0度-

我有一个小的JavaScript AJAX脚本,它可以以kbps或其他任何速度(比如MB/s)获得进度。现在我想添加一个仪表,以图形方式显示速度

我会有一个包含仪表设计的图像和另一个带有指针的图像。默认情况下,指针指向顶部-最低值为-120度,最高值为120度。但如果某人有1mb的连接,那就不好了,所以我需要添加一个指数计算

以下是价值观

  • 0-1MB:-120度->90度
  • 1-5MB:-90度->60度
  • 5-10MB:-60度->30度
  • 10-20MB:-30度->0度
  • 20-30MB:0度->30度
  • 30-50MB:30度->60度
  • 50-75MB:60度->90度
  • 75-100MB:90度->120度
我完全不知道如何开始计算

动画是由CSS完成的

-webkit转换:旋转(Xdeg)
它会在

xhr.onprogress
获得速度的计算为:

kb/s=((e.loaded/((new Date()-start)/1000))/1024).toFixed(2),
MB/S=(d/1024*8).toFixed(2)
当我有MB/s时,我只想设置仪表度数

如何实现这些价值观

这是一个不完全工作的变体。我是用
写的,虽然
,但我认为这不是正确的方法


测量
img{位置:固定;顶部:100px;左侧:100px;}
变量b=[1,5,10,20,30,50,75100150],
deg=30;
get=函数(a){
var l=b.长度
而(l--){

如果(b[l]这是我需要的工作代码。但我知道你们有更好的方法

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>gauge</title>
<style>
img{position:fixed;top:100px;left:100px;}
.pointer{-webkit-transform:rotate(-120deg);}
input{width:100%;}
</style>
<script>
var pointer,
get=function(a){
 var b=[0,1,5,10,20,30,50,75,100],l=b.length,c=30,x=-120;
 if(a>=b[l-1]){
  x=120;
 }else{
  while(l--){
   if(b[l]<a&&a<=b[l+1]){
    x=(c*l-120)+c*((a-b[l])/(b[l+1]-b[l]));
    break;
   }
  }
 }
 pointer.style['-webkit-transform']='rotate('+x+'deg)';
}
window.onload=function(){
 pointer=document.getElementsByClassName('pointer')[0];
}
</script>
</head>
<body>
<img src="gauge1.png"><img class="pointer" src="pointer.png">
<input type="range" min="0" max="100" value="0" onChange="get(this.value)" step="0.1">
</body>
</html>

测量
img{位置:固定;顶部:100px;左侧:100px;}
.pointer{-webkit变换:旋转(-120度);}
输入{宽度:100%;}
变量指针,
get=函数(a){
变量b=[0,1,5,10,20,30,50,75100],l=b.长度,c=30,x=-120;
如果(a>=b[l-1]){
x=120;
}否则{
而(l--){

如果(b[l]这是我需要的工作代码。但我知道你们有更好的方法

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>gauge</title>
<style>
img{position:fixed;top:100px;left:100px;}
.pointer{-webkit-transform:rotate(-120deg);}
input{width:100%;}
</style>
<script>
var pointer,
get=function(a){
 var b=[0,1,5,10,20,30,50,75,100],l=b.length,c=30,x=-120;
 if(a>=b[l-1]){
  x=120;
 }else{
  while(l--){
   if(b[l]<a&&a<=b[l+1]){
    x=(c*l-120)+c*((a-b[l])/(b[l+1]-b[l]));
    break;
   }
  }
 }
 pointer.style['-webkit-transform']='rotate('+x+'deg)';
}
window.onload=function(){
 pointer=document.getElementsByClassName('pointer')[0];
}
</script>
</head>
<body>
<img src="gauge1.png"><img class="pointer" src="pointer.png">
<input type="range" min="0" max="100" value="0" onChange="get(this.value)" step="0.1">
</body>
</html>

测量
img{位置:固定;顶部:100px;左侧:100px;}
.pointer{-webkit变换:旋转(-120度);}
输入{宽度:100%;}
变量指针,
get=函数(a){
变量b=[0,1,5,10,20,30,50,75100],l=b.长度,c=30,x=-120;
如果(a>=b[l-1]){
x=120;
}否则{
而(l--){
符合你们规范的指数函数的if(b[l]公式
设d为[-120120]中的度数

设f(d)为下载速度,单位为MB/S,其中f(d)=a*额定值+b

让MIN和MAX分别为-120度和120度对应的下载速度

然后我们有以下两个方程

最小值=f(-120)=a*速率-120+b

最大值=f(120)=a*120+b

我们可以如下解a和b

最大-最小=a*(速率120-速率120)

=>a=(最大-最小)/(速率120-速率120)

=>b=MIN-a*速率-120

现在选择MIN、MAX和RATE。函数s(d)的反比是将以MB/s为单位的速度映射为以度为单位的值

d=f-1(s)=对数率((s-b)/a)


神奇配方随时可用 如果选择MIN=0.1 MB/S=100 kB/S,MAX=100 MB/S,RATE=1.011662,则f-1(20)=0。然后函数变为:

d=f-1(s)=log1.011662 ((s+6.488681037)/26.48810966)

看起来是这样的:

d = Math.log((s + 6.488681037) / 26.48810966) / Math.log(1.011662)

请注意通过的三个关键点:

  • (0.1 MB/S,-120度)
  • (20 MB/S,0度)
  • (100 MB/S,120度)
在JavaScript中,公式如下所示:

d = Math.log((s + 6.488681037) / 26.48810966) / Math.log(1.011662)
其中,
s
是以MB/s为单位的速度,
d
是您应该使用的度数。

符合您规范的指数函数公式 设d为[-120120]中的度数

设f(d)为下载速度,单位为MB/S,其中f(d)=a*额定值+b

让MIN和MAX分别为-120度和120度对应的下载速度

然后我们有以下两个方程

最小值=f(-120)=a*速率-120+b

最大值=f(120)=a*120+b

我们可以如下解a和b

最大-最小=a*(速率120-速率120)

=>a=(最大-最小)/(速率120-速率120)

=>b=MIN-a*速率-120

现在选择MIN、MAX和RATE。函数s(d)的反比是将以MB/s为单位的速度映射为以度为单位的值

d=f-1(s)=对数率((s-b)/a)


神奇配方随时可用 如果选择MIN=0.1 MB/S=100 kB/S,MAX=100 MB/S,RATE=1.011662,则f-1(20)=0。然后函数变为:

d=f-1(s)=log1.011662 ((s+6.488681037)/26.48810966)

看起来是这样的:

d = Math.log((s + 6.488681037) / 26.48810966) / Math.log(1.011662)

请注意通过的三个关键点:

  • (0.1 MB/S,-120度)
  • (20 MB/S,0度)
  • (100 MB/S,120度)
在JavaScript中,公式如下所示:

d = Math.log((s + 6.488681037) / 26.48810966) / Math.log(1.011662)

其中,
s
是以MB/s为单位的速度,
d
是你应该使用的度数。

你现有的代码在哪里?你尝试过什么?你在这方面做过什么研究?听起来你需要一些三角函数!啊,三角函数…很久没有听到这个词了…这就是为什么我不知道n知道要搜索什么..您在哪个部分遇到问题?您在设置仪表动画/渲染仪表时遇到问题吗?或者您在转换大小(mb/s)时遇到问题度?啊,正弦-余弦…切线…看起来有很多问题…是的,这就是问题所在。我不知道如何获得???magintude???。你应该能够适应我的答案。你现有的代码在哪里?你尝试了什么?你在这方面做了什么研究?听起来你需要一些三角函数!h嗯,三角函数…很长时间我没听过这个词…这就是为什么我甚至不知道要搜索什么…你有什么问题吗?你有没有问题动画/渲染仪表?或者你有问题在大小之间转换(mb/s)那么度呢?啊,正弦-余弦…切线…看起来有很多问题…是的,这就是问题所在。我不知道