Подтвердить что ты не робот

Функция Remap или Map в Javascript

В последнее время большая часть моего опыта программирования была в Processing, и совсем недавно я хотел развернуть немного глубже в некоторых JavaScript, так как они немного связаны.

Мне просто интересно, поскольку мой недавний поиск ничего не изменил, если JavaScript имел аналогичную функцию для обработки функции "map", в которой значение и диапазон принимается и переназначается в новый диапазон?

Дополнительная информация здесь: http://processing.org/reference/map_.html

PS: Да, я также знаю, что существует www.processingjs.org, но мне просто интересно, была ли у JS такая функция изначально.

4b9b3361

Ответ 1

Функция ниже производит то же поведение, что и исходная функция обработки:

function map_range(value, low1, high1, low2, high2) {
    return low2 + (high2 - low2) * (value - low1) / (high1 - low1);
}

Ответ 2

Вот реализация методов удобства обработки Math в Javascript. Это прямое преобразование исходного источника обработки Java.

p5.sq()
p5.constrain()
p5.degrees()
p5.mag()
p5.dist()
p5.lerp()
p5.norm()
p5.map()

Получить код отсюда: https://github.com/trembl/p5.Math.js/

Ответ 3

Не изначально. Ядро JavaScript действительно минимально (см. см. для получения подробной информации). Математические функции ограничены тем, что вы находите в объекте Math. Поэтому, чтобы такая функция была широко доступна, вам нужна реализация в самом Javascript.

Ответ 4

edit Используйте код @Alnitak; эта версия верна.

Нет, это не так, но вы можете написать довольно легко:

function adjust(value, r0, r1, r2, r3) {
  var mag = Math.abs(value - r0), sgn = value < 0 ? -1 : 1;
  return sgn * mag * (r3 - r2) / (r1 - r0);
}

Я бы не назвал это "картой" лично, из-за (ну, моей) ассоциации "карты" с механизмом обработки списка.

(Обратите внимание, что, возможно, вы захотите проверить ошибки разворота диапазона, я не знаком с точной семантикой "карты" от Processing.)

Ответ 5

Многоразовый переназначение

Если вы хотите переназначить более одного значения в определенный диапазон, вы можете использовать эту версию вместо этого.

/**
 * Create a function that maps a value to a range
 * @param  {Number}   inMin    Input range minimun value
 * @param  {Number}   inMax    Input range maximun value
 * @param  {Number}   outMin   Output range minimun value
 * @param  {Number}   outMax   Output range maximun value
 * @return {function}          A function that converts a value
 * 
 * @author Victor N. wwww.victorborges.com
 * @see https://gist.github.com/victornpb/51b0c17241ea483dee2c3a20d0f710eb/
 */
function createRemap(inMin, inMax, outMin, outMax) {
    return function remaper(x) {
        return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
    };
}

Примеры использования

var f2c = createRemap(32,212, 0,100); //fahrenheit to celsius
var c2f = createRemap(0,100, 32,212); //celsius to fahrenheit

f2c(-459.67) //-273.15
c2f(-273.15) //-459.6699999999999
c2f(96)      //204.8
f2c(96)      //35.55555555555556
f2c(60)      //15.555555555555555
f2c(90)      //32.22222222222222
c2f(70)      //158
c2f(-30)     //-22
c2f(0)       //32
f2c(32)      //0


var p = createRemap(0,1, 0,100);    

p(0)    //0
p(0.33) //33
p(0.5)  //50
p(0.99) //99
p(1)    //100
p(1.5)  //150
p(-0.1) //-10


var map8b10b = createRemap(0,255, 0,1023);

map8b10b(0)   //0
map8b10b(32)  //128.3764705882353
map8b10b(64)  //256.7529411764706
map8b10b(128) //513.5058823529412
map8b10b(255) //1023