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-transform:rotate(Xdeg)

它会更新

xhr.onprogress

获得速度的计算是:

kb/s=((e.loaded/((new Date()-start)/1000))/1024).toFixed(2),
MB/S=(d/1024*8).toFixed(2)

当我有 MB/s 时,我只想设置仪表度数。

我怎样才能实现这些价值?

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

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>gauge</title>
<style>
img{position:fixed;top:100px;left:100px;}
</style>
<script>
var b=[1,5,10,20,30,50,75,100,150],
deg=30;
get=function(a){
 var l=b.length
 while(l--){
  if(b[l]<=a&&a<b[l+1]){
   rotation=((l*deg)+(deg/(b[l+1]-b[l])*(a-b[l])));
   pointer=document.getElementsByTagName('img')[1]
   pointer.style['-webkit-transform']='rotate('+(rotation-120)+'deg)';
   console.log(rotation)
  }
 }
}
</script>
</head>
<body>
<input onChange="get(this.value)">
<img src="gauge1.png"><img src="pointer.png">
</body>
</html>

它不适用于小于 5 和大于 150 的值。

在这里编辑 是我需要的工作代码

<!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>
4

2 回答 2

4

符合您的规格的指数函数公式

设 d 为 [-120 , 120] 中的度数。

令 f(d) 为下载速度,以 MB/S 为单位,其中 f(d) = a * RATE d + b。

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

然后我们有以下两个等式。

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

MAX = f(120) = a * RATE 120 + b

我们可以如下求解a和b。

MAX - MIN = a * (RATE 120 - RATE -120 )

=> a = (MAX - MIN) / (RATE 120 - RATE -120 )

=> b = MIN - a * RATE -120

现在您选择 MIN、MAX 和 RATE。函数 s(d) 的逆函数用于将 MB/S 速度映射到度数。

d = f -1 (s) = log RATE ((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) = log 1.011662 ((s + 6.488681037) / 26.48810966)

它看起来像这样:

在此处输入图像描述

注意通过的三个关键点:

  • (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是您应该使用的度数。

于 2013-08-13T22:28:58.273 回答
0

这是我需要的工作代码。但我知道你们有更好的方法。

<!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 src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABlCAMAAABjot39AAACJVBMVEVpaWlmZmaampptbW1xcXGK
ioqCgoJ2dnalpaWZmZmmpqZra2ttbW19fX2GhoZubm6jo6OZmZlra2t0dHSdnZ1paWl4eHibm5uU
lJSSkpJ6enqpqamCgoJra2uPj4+oqKhzc3N3d3efn5+ZmZl6enpubm6goKCfn5+NjY13d3erq6un
p6dra2uPj4+GhoaoqKhtbW2AgIBubm5tbW19fX1ra2uOjo6qqqqdnZ2WlpapqamIiIiAgICqqqqQ
kJBsbGxzc3OkpKRtbW1+fn6bm5urq6uIiIiWlpZ1dXWkpKSgoKCPj49ra2tsbGyMjIyGhoZ+fn6o
qKiKioqhoaF8fHyEhISTk5OioqJ3d3d7e3uVlZVxcXFwcHCkpKSsrKxvb2+hoaFubm6Hh4dvb2+q
qqqJiYmfn5+goKCDg4OTk5Nzc3OioqKRkZFubm6qqqp2dnZvb2+EhISmpqaDg4P///9eXl7d3d0u
Li7t7e1ubm5NTU3Nzc0NDQ2pqan0crR+fn6NjY329vZVVVXV1dUmJiZ1dXUYGBg4ODixsbGVlZXl
5eW9vb1lZWVERETFxcWFhYUGBgahoaH8brQ/Pz+1tbX4+PhaWlrZ2dn8ZrQqKirkgrSZmZnp6elq
ampJSUnJyckICAilpaXUiqwWFhY3Nzd5eXmJiYnx8fFSUlLR0dHUdqQhISGsrKxxcXGRkZHh4eG5
ublhYWFBQUGdnZ3BwcGBgYEAAAAixRikAAAAdHRSTlPRYq8yo8l02cFKgbMUs89M6d2H5Y/nXhIu
z8n568uNTvHBw2iPXKH7KKPNMLH7XI/r3d1sMI+xs07rZI9K3Vh004n1aLnp9XLx1aPn0SjPhfvJ
sde7y8dcg05eg7/xjcvTsQKPcBKBMOWF6fH1ZErT+2KhBLKdFtgAAAjiSURBVGiBtZqNt9xEFcCj
BUTko1hFoUWhUJHiBx+VioAotQgKpaBYkGJlQapCFdmw7iOdk6zL1mRTk85pSg4n+xrn1KTkdDbJ
I8n+fd6Z7Nvvr+5m7znvnfPeeW9+ez/mzp17RyiVF5QHjt3wwfXP7XwDY/zuzj/u/dU7x06WFv1n
YaE//PYPX9qNBoUQArT79n7txwuRFqD85CAQKKWqxSS2VJVuozBOnF/c8425a8yj/O0gENQ4NVxJ
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"><img class="pointer" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABlBAMAAACmUjD8AAAAGFBMVEUAAAAAAACvr68AAAAAAAD7
+/v///8w/wBT0ZSsAAAABnRSTlNIJAIwGAJbm9I6AAAAWElEQVRYhe3WwQmAMAwF0M4idJFO0Is9
K+7g/F3ACs2hiLx/DY8PuSQp77OpiWE+Ycpo8mLOgLkYhmEY5r+mHtu0aXdZ0hPaQeTWR36KYRiG
YRiGYZgH0wE4cpP+NNw9cwAAAABJRU5ErkJggg==">
于 2013-08-13T20:36:11.040 回答