如何在 javascript 中生成连续颜色列表

how to generate a list of successive colors in javascript

我正在尝试为 d3.js 热图目的生成 "successive" 颜色列表。 所以,我正在寻找一个函数,它接受输入的起始颜色(比如十六进制的红色)、结束颜色(比如十六进制的蓝色)和一个整数(在其间生成的十六进制颜色的数量返回为列表的一种形式。

build_colors(start_color,end_color,nb_colors) -> list of colors

我不寻找太复杂的东西(比如在黎曼知觉 space 的两个颜色端点之间的测地线上以恒定速度采样)!

这可能相当容易,但我是 javascript / d3.js 以及基本上所有网络技术的初学者。

D3有一个内置的颜色插值器,实际上有几个。最接近的可能是 f=d3.interpolateHsl(a, b),其中 ab 是两种颜色。它 returns 一个插值函数 f 取一个介于 0 和 1 之间的参数,并返回 a 到 b 范围内的相应颜色。

如果你真的需要一个数组而不是一个函数,你可以这样做:

var colors=[];
var nColors=20;
for (var i=0; i<nColors; i++)
  colors.push(f(i/(nColors-1)));

检查这个问题: Javascript color gradient

RainbowVis-JS 完全符合您的要求: https://github.com/anomal/RainbowVis-JS

出于计算目的,我认为将颜色表示为 0 到 255 之间的三个整数更容易。CSS 颜色属性然后可以分配格式为 "rgb(64, 32, 16)".[=13= 的值]

因此,对于您的 build_color(…) 函数,我认为最好的办法是接受 return 颜色作为三个整数的数组。

这是一个例子:

var build_colors = function(start, end, n) {
    
    //Distance between each color
    var steps = [
      (end[0] - start[0]) / n,  
      (end[1] - start[1]) / n,  
      (end[2] - start[2]) / n  
    ];
    
    //Build array of colors
    var colors = [start];
    for(var ii = 0; ii < n - 1; ++ii) {
      colors.push([
        Math.floor(colors[ii][0] + steps[0]),
        Math.floor(colors[ii][1] + steps[1]),
        Math.floor(colors[ii][2] + steps[2])
      ]);
    }
    colors.push(end); 
   
    return colors;
  };
  


  //Example: ten colors between red and blue
  var colors = build_colors([255, 0, 0], [0, 0, 255], 10);  
  
  //Render
  for(var ii = 0; ii < 10; ++ii) {
    var div = document.createElement("div");
    div.setAttribute("style", "background: rgb(" + colors[ii].join(",") + ")");
    document.body.appendChild(div);    
  }
div {
  width: 100px;
  height: 25px;
}
<body>
</body>