问题描述
|
最近,我大部分的编程经验是在Processing上,最近,我一直想深入研究一些JavaScript,因为它们之间有些许关联。
我只是想知道,由于我最近的搜索没有发现JavaScript是否具有与Processing的\“ map \”函数类似的功能,其中取了一个值及其范围并将其重新映射到新范围?
此处的更多信息:http://processing.org/reference/map_.html
PS:是的,我也知道www.processingjs.org存在,但是我只是想知道JS是否本身具有这样的功能。
解决方法
下面的函数产生与原始处理函数相同的行为:
function map_range(value,low1,high1,low2,high2) {
return low2 + (high2 - low2) * (value - low1) / (high1 - low1);
}
,这是Java语言中Processing Math便捷方法的实现。它是原始Processing Java源代码的直接转换。
p5.sq()
p5.constrain()
p5.degrees()
p5.mag()
p5.dist()
p5.lerp()
p5.norm()
p5.map()
从此处获取代码:https://github.com/trembl/p5.Math.js/
,不是本地的。 Javascript核心确实很小(请参阅参考资料以获取详细信息)。数学函数仅限于您在Math对象中找到的函数。因此,要使此类功能广泛可用,您需要使用Javascript本身实现。
,可重用的重映射
如果要将一个以上的值重新映射到定义的范围,则可能要改用此版本。
/**
* 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,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,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,1023);
map8b10b(0) //0
map8b10b(32) //128.3764705882353
map8b10b(64) //256.7529411764706
map8b10b(128) //513.5058823529412
map8b10b(255) //1023
,编辑使用@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);
}
我个人不会称其为“ map”,因为(“我的”)“ map”与列表处理机制相关联。
(请注意,我猜您可能想检查范围反转错误;我对Processing的\“ map \”的确切语义不熟悉。)