2016-10-18 10 views
0

this questionfabulous answer for values from 0..1を含む)に基づいて、最小値と最大値を含むように関数を修正しようとしました。小数点を含む動的値に基づいて勾配ステップを生成

function getColor(value, min, max){ 
    var hue=((max-(value-min))*120).toString(10); 
    return ["hsl(",hue,",100%,50%)"].join(""); 
} 

小数点以下は整数では問題ありませんが、小数点以下では問題ありません。

var value=42; 
var d=document.createElement('div'); 
d.textContent="value="+value + " (this should be green)"; 
d.style.backgroundColor=getColor(value,42,100); 
document.body.appendChild(d); 

var value=42; 
var d=document.createElement('div'); 
d.textContent="value="+value + " (this should be red)"; 
d.style.backgroundColor=getColor(value,0,42); 
document.body.appendChild(d); 

をしかし、これらにはありません:たとえば、これらは期待どおりに動作

var value=0.1; 
var d=document.createElement('div'); 
d.textContent="value="+value + " (this should be green)"; 
d.style.backgroundColor=getColor(value,0,90); 
document.body.appendChild(d); 

var value=0.1; 
var d=document.createElement('div'); 
d.textContent="value="+value + " (this should be green)"; 
d.style.backgroundColor=getColor(value,0,5); 
document.body.appendChild(d); 

最後のものは... Here is a fiddle実際に青です。どのようにして4つすべてのシナリオで動作するように変更できますか?

答えて

1

これは非常にうまく動作するようです:

function getColor(value, min, max){ 
    if (value > max) value = max; 
    var v = (value-min)/(max-min); 
    var hue=((1 - v)*120).toString(10); 
    return ["hsl(",hue,",100%,50%)"].join(""); 
} 

編集:調整

+0

以下のコメントをもとに、私はあなたのコードが間違っていると思いますが、機能は1-0の間の正規化値を見込んで、これだけのことを確認してください入力値は最小値/最大値に基づいて1〜0の間で正規化されます。次に、その値を持つ関数を入力します。 http://stats.stackexchange.com/a/70807 – user5542121

+0

詳しいことができますか? 'var v =(value-min)/ max;'は常に1-0、noの間の値でなければなりません。関数外で計算を行うのはなぜですか? –

+0

正規化についての上記の答えによると。その数式は正しくありません。そのほぼ正確ではあるが、完全には正確ではない。 など。 max = 1、max = 1000、value = 1000、v => 0.996 のようになりますが、1にする必要があります。 – user5542121

関連する問題