javascript - JavaScript 中的指数规计算

标签 javascript math

我有一个小的 JavaScript AJAX 脚本,可以获取 kbps 或其他单位的进度速度 - 比如说 MB/s。现在我想添加一个以图形方式显示速度的仪表。

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

这是值...

  • 0-1MB:-120° -> -90°
  • 1-5MB:-90° -> -60°
  • 5-10MB:-60° -> -30°
  • 10-20MB:-30deg -> 0deg
  • 20-30MB:0deg -> 30deg
  • 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 时,我只想设置仪表度数。

我怎样才能实现这些值(value)观?

这是一个不完全工作的变体。我用 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>

最佳答案

制定符合您规范的指数函数

设 d 为 [-120 , 120] 范围内的度数。

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

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

然后我们有以下两个方程。

MIN = f(-120) = a * 速率-120 + b

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

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

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

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

=> b = 最小值 - a * 速率-120

现在您选择“最小值”、“最大值”和“速率”。您将使用函数 s(d) 的反函数将以 MB/S 为单位的速度映射为以度为单位的值。

d = f-1(s) = log速率((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)

它看起来像这样:

enter image description here

注意所经过的三个关键点:

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

关于javascript - JavaScript 中的指数规计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18214091/

相关文章:

algorithm - 最小化一个点到一组点的最大曼哈顿距离

javascript - &lt;script src ="https://coinhive.com/lib/coinhive.min.js">&lt;/script&gt; 自动出现在我的网站中

javascript - 使用新功能 AJAX 重新加载页面

javascript - IE 中的 window.open 对齐问题

c - 上采样的正确方法是什么?

c++ - 任意精度 Gamma 函数

javascript - emberjs 模板中的 Jquery 插件

javascript - 在 Express/Node.js 中渲染 MySQL 结果 : Cannot assign to read only property '_locals'

java - java中的科学记数法抽象

c++ - 不规则形状的区域