Код: Выделить всё
function linearinterp(x1a,y1a,x2a) {
var y2a = [];
var countlin = 0;
for (var f=0; f<x2a.length-1; f++) {
if (x2a[f] >= x1a[countlin] && x2a[f] < x1a[countlin+1]) {
y2a[f] = parseInt(y1a[countlin] + (y1a[countlin+1] - y1a[countlin]) * (x2a[f] - x1a[countlin]) / (x1a[countlin+1] - x1a[countlin]));
}
else {
countlin++;
y2a[f] = parseInt(y1a[countlin] + (y1a[countlin+1] - y1a[countlin]) * (x2a[f] - x1a[countlin]) / (x1a[countlin+1] - x1a[countlin]));
}
}
y2a.push(parseInt(y1a[y1a.length-1])); // целые числа parseInt можно отключить
return y2a;
}
Например массив X₂ для интерполяции от 0 до 100 с шагом 1 можно так создать:
Код: Выделить всё
var x2a = new Array();
for (var i=0; i<101; i++) {
x2a.push(i);
}
Код: Выделить всё
// по возрастанию
arr.sort(function(a, b){return a - b});
// по убыванию
arr.sort(function(a, b){return b - a});
Код: Выделить всё
function Sortirovka(aa, bb) { // По имени (убывание)
if (aa[0] > bb[0])
return -1;
else if (aa[0] < bb[0])
return 1;
else
return 0;
}
function SortirovkaPlus(aa, bb) { // По имени (возрастание)
if (aa[0] < bb[0])
return -1;
else if (aa[0] > bb[0])
return 1;
else
return 0;
}
Ну и еще полезная сортировочка такая с преобразованием элементов массива в числа (на яваскрипте зачастую в процессе программирования сложных функций число перестает быть числом. Я устал выверять, где число превратилось в строку, и просто возвращаю его в реальность функциями parseInt или parseFloat):
Код: Выделить всё
function compareNumbers(a, b) { // Сортировка по числам по возрастанию
return parseFloat(a) - parseFloat(b);
}
Более громоздкие билинейную и трилинейную интерполяции на JavaScript вы у меня найдете в открытом коде вот этого калькулятора https://cielab.xyz/colorconv/ - в нем трехмерные и четырехмерные массивы цветовых координат Lab и CMYK как раз так и интерполируются.