2012-01-04 23 views
5

Mam suwak JavaScript, który wysyła wartość między 0 i 1 w zależności od jego położenia. Chcę przekonwertować tę wartość do wartości w innej skali między 100 i 1000, ale w oparciu o dystrybucję zestawu punktów danych od 100 do 1000.suwak javascript ważone wartości

W przypadku użycia chcę, aby suwak był mniej wrażliwe na zmiany, gdy istnieje bardzo bliski zbiór liczb. Np ... powiedzmy wartości w skali są:

100, 200, 300, 500, 1000 

Wartości 100-500 może potrwać, powiedzmy, 80% pierwszego suwaka ze względu na ich bliższej dystrybucji, dlatego dzięki czemu łatwiej wybrać między nimi.

Wyraźnie istnieje funkcja matematyczna do obliczenia tego, być może obejmująca standardowe odchylenie i współczynniki. Ktokolwiek wie co to jest?

Odpowiedz

2

Korzystanie interpolacji liniowej między wartościami na dużą skalę, coś

var bigValues = [100, 200, 300, 500, 1000]; 
var input; /* will vary in the range [0.0..1.0] */ 
var idx; /* index of nearest entry in bigValues below input */ 
var frac; /* fraction [0.0..1.0) in interval in bigValues */ 
var output; 
/* try some test values for input */ 
for (var i = 0; i<=20; i++) { 
    input = i * 0.05; 
    idx = Math.floor(input * (bigValues.length - 1)); 

    frac = (input - (idx)/(bigValues.length - 1)) * (bigValues.length - 1); 
    if (frac == 0) { /* no need to calculate */ 
     output = bigValues[idx]; 
    } 
    else { 
     output = bigValues[idx] + (bigValues[idx+1] - bigValues[idx]) * frac; 
    }; 
    document.write(input + ', ' + output + '<br />'); 
} 
+0

Dzięki, t jego ładnie działa. Jaki jest najlepszy sposób na odwrócenie tego obliczenia? –

1

Sądzę, że można by zastosować dowolne równanie wielomianowe, używając wartości suwaka jako zmiennej niezależnej. Konkretne równanie zależałoby od twoich konkretnych potrzeb/dystrybucji.

Na przykład -1 * (X^2) nie daje nawet odwróconą parabolę jeśli X = 10 * [slider value]

1

dla dowolnych wartości Chciałbym zaproponować jakąś interpolacji spline. Konwersja zestawu wartości do zbioru punktów, gdzie druga współrzędna jest w „skali suwaka”:

(100, 0.0), (200, 0.25), (300, 0.5), (500, 0.75), (1000, 1.0) 

Teraz wystarczy użyć interpolacji spline swojego wyboru, aby utworzyć gładką krzywą, a skoro masz krzywą możesz uzyskać wartości w skali 100-1000.

Jeśli nie chcą wprowadzić żadnej skomplikowanej interpolacji spline, można po prostu wziąć jeden liniowy, co oznacza, że ​​dla każdego punktu swojej suwaka między 0,0 a 0,25 Państwo liniowo interpolować między 100 a 200, między 0,25 a 0,5 interpolować między 200 a 300 i tak dalej.

0

(nie wiem co to za pytanie etykieta przeciwnego do pierwotnego pytania w a comment, ale dodam ona jako dodatkowy odpowiedź dopasować kod)

Kontynuując od my previous answer ze wszystkich zmiennych zadeklarowanych jak poprzednio.

document.write('The other way round:<br />'); 

function findIntervalStart(n) { 
    for (var i = 1; i < bigValues.length; i++) if (n < bigValues[i]) return i-1; 
} 
/* try some test values */ 
for (var i = 1; i <= 21; i++) {  
    output = i * 50; 
    if (output >= bigValues[bigValues.length - 1]) { 
     input = 1; 
    } 
    else if (output <= bigValues[0]) { 
     input = 0; 
    } 
    else { 
    idx = findIntervalStart(output); 
     frac = (output - bigValues[idx])/(bigValues[idx + 1] - bigValues[idx]); 
     input = (idx + frac)/(bigValues.length - 1); 
    }; 

    document.write(output + ', ' + input + '<br />'); 
}