【问题标题】:How to map an array of integers to a color shade in NodeJS?如何将整数数组映射到NodeJS中的颜色阴影?
【发布时间】:2020-01-04 22:58:38
【问题描述】:

将整数数组映射到颜色范围的最佳方法是什么? 我有一个数组:

count = [ '290', '11', '8', '8', '6', '6', '3', '3', '3', '3' ]

我想映射到从 rgb(255, 0, 0) 到 rgb(255, 255, 255) 的红色阴影。

目前我只是用here的这个函数将数组中的整数映射到0-255:

const scale = (num, in_min, in_max, out_min, out_max) => { return (num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

var count = [ '290', '11', '8', '8', '6', '6', '3', '3', '3', '3' ]
var count_last = count[count.length - 1];
var count_first = count[0];
var new_count  = []
count.forEach(function(entry) {
  new_count.push(Math.round(scale(entry, count_last, count_first, 255, 0)))
})`

输出:

[ 0, 248, 251, 251, 252, 252, 255, 255, 255, 255 ]

这是可行的,但在这个例子中,值 290 将是红色的,而所有其他值几乎是白色的,所以你无法区分它们,尽管例如 11 比 3 大得多。有没有其他方法可以让我动态将整数映射到红色阴影还是我必须硬编码颜色会改变的阈值?

【问题讨论】:

    标签: javascript arrays node.js mapping


    【解决方案1】:

    如果我对您的理解正确,您对将一个数字范围线性映射到其他数字范围感兴趣。从数学上讲,您对bijective function from [a,b] to [c,d] 感兴趣。

    您想使用它来将map a range of integers(这意味着您知道输入的范围)变为红色阴影,其中红色跨度为 [0,255](256 个红色阴影,这是输出的范围)

    因此,假设您的输入范围(基于 count 数组中的最小值和最大值)为 [3,290] 并且输出的范围为 [0,255],那么当您从输入中输入值 3 时对于映射函数,它应该返回 0。输入中的值 290 也是如此,它在输出中映射到 255。所以如果M(x)是一个映射函数,我们有:

    M(3) = 0
    M(290) = 255
    

    我们手头有 2 个点 (3,0) 和 (290,255)。 by euclidean geometry:任何两个不同的点,都有一条包含它们的唯一线;并且情节是由

    f(x) = f'(x)(x-x_0) + y_0
    

    在哪里

    f'(x) = (y_1 - y_2) / (x_1 - x_2)
    

    在你的情况下,它是

    M(x) = (255 - 0) / (290 - 3) * (x - 3) + 0
    

    其中x 属于您输入的游侠,在本例中为 [3,290]

    请注意,如果这两个范围的大小不同,则根据映射的量化,某些值可能会重叠。

    【讨论】:

    • 是的,但这就是我在我提到的功能中已经得到的。我的问题是我得到的较低数字的色调差异是如此之小,以至于您无法真正看到它。但我想没有比硬编码阈值更好的方法了。
    • @creerow:我认为我的回答通常会阐明这件事,并且会对您有所帮助:|
    • 它确实帮助我更好地理解了我正在使用的功能:D
    • @creerow:如果你喜欢我的回答,请接受:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2016-02-01
    • 1970-01-01
    • 2012-09-21
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多