0

kbps などで進行速度を取得する小さな JavaScript AJAX スクリプトがあります (MB/s としましょう)。そして今、速度をグラフィカルに表示するゲージを追加したいと思います。

ゲージのデザインを含む画像とポインターを含む画像があります。デフォルトでは、ポインタは上を指します。最小値は -120 度、最大値は 120 度です。しかし、誰かが 1 MB の接続を持っている場合、それは良くないので、指数計算を追加する必要があります。

ここに値があります...

  • 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 を超える値では機能しません。

ここで編集 は、私が必要とするもののWORKINGコードです

<!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 度に対応するダウンロード速度とします。

すると、次の 2 つの方程式が得られます。

MIN = 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) = log 1.011662 ((s + 6.488681037) / 26.48810966)

次のようになります。

ここに画像の説明を入力

次の 3 つの重要なポイントに注意してください。

  • (0.1MB/秒、-120度)
  • (20MB/秒、0度)
  • (100MB/秒、120度)

JavaScript では、数式は次のようになります。

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

ここsで、 は速度 (MB/S) で、dは使用する角度です。

于 2013-08-13T22:28:58.273 に答える