Remap или функция карты в Javascript
В последнее время большая часть моего опыта программирования была в обработке, и в последнее время я хотел немного углубиться в некоторый JavaScript, так как они немного связаны.
Мне было просто интересно, так как мой недавний поиск ничего не дал, если JavaScript имеет функцию, аналогичную функции "карты" Обработки, в которой значение и его диапазон берутся и переназначаются в новый диапазон?
Более подробная информация здесь: http://processing.org/reference/map_.html
PS: Да, я также знаю, что www.processingjs.org существует, но мне было просто интересно, была ли у JS такая функция изначально.
5 ответов
Функция ниже производит то же поведение, что и исходная функция обработки:
function map_range(value, low1, high1, low2, high2) {
return low2 + (high2 - low2) * (value - low1) / (high1 - low1);
}
Многоразовый переназначение
Если вы хотите переназначить более одного значения в определенный диапазон, вы можете вместо этого использовать эту версию.
/**
* 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
Вот реализация удобных методов Processing 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/
редактировать Используйте код @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.)