javascript - 颜色比例取决于绘制点的频率(JS Canvas)

标签 javascript canvas colors

最近我创建了一个项目,涉及在 Canvas 上绘制很多点来绘制一个奇怪的吸引子。这个项目的细节并不是很相关,但如果你想看到它的实际效果,请到这里:How can I check if an attractor is strange?

我遇到的问题如下:如何在 Canvas 上绘制一个点,其颜色取决于已经存在的颜色?换句话说:我如何实现一个取决于次数的色标,一个特定的点已经被着色了?

我确实找到了一种方法,但我不确定它是否是最好的。这是它的工作原理:

ctx.globalCompositeOperation = "lighter";
ctx.fillStyle = "rgb(50,5,1)";
ctx.fillRect(x,y,size,size);

它只是添加到已经存在的颜色上。这看起来已经很不错了:enter image description here

但是使用这种方式也有很多限制:

  • 例如,我无法将颜色从绿色变为红色
  • 在白色背景上使用此方法是不可能的
  • 我无法创建包含超过“固定点”的色阶,例如红色->绿色->蓝色

也许你知道比我更有效的方法......

最佳答案

我认为您需要跟踪每个像素的命中率以实现允许您更改图片颜色的功能,而不仅仅是亮度或红色。如上所述,您应该使用多维数组来跟踪每个像素的命中率。

var canvasPixels = [];
for (var y = 0; y < 1000; y++) {
    canvasPixels[y] = [];
    for (var x = 0; x < 1000; x++) {
    canvasPixels[y][x] = 0;
  }
}

如果您自己应用颜色数学,您可以做很多事情。我在这里使用彩色正弦波。

function getColor(hits) {

  var frequency = 0.3;
  var r = Math.round(Math.sin(frequency*hits + 0) * 127 + 128);
  var g = Math.round(Math.sin(frequency*hits + 2) * 127 + 128);
  var b = Math.round(Math.sin(frequency*hits + 4) * 127 + 128);

  return "rgb(" + r + "," + g + "," + b + ")";
}

然后,你只需要在绘制时使用这个函数在彩虹中循环。

canvasPixels[y][x]++;
ctx.fillStyle = getColor(canvasPixels[y][x]);
ctx.fillRect(x,y,size,size);

关于javascript - 颜色比例取决于绘制点的频率(JS Canvas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44017730/

相关文章:

javascript - 为什么 drawImage() 在许多浏览器中比 createPattern() 表现略好/明显好?

javascript - 如何让 HTML5 Canvas 显示 HTML?

html - 边框颜色忽略我的颜色

c++ - 从 make 中突出显示 C/C++ 错误?

javascript - 通过创建的 HTML 代码调用函数

javascript - D3 从最右边的字符对齐轴左侧的文本

javascript - jQuery 进度条

javascript - 拉伸(stretch)文本 ... 如果在 Html5 Canvas 中长度大于 10

javascript - 在 div 元素上设置样式属性

cocoa - NSBezierPath 描边颜色错误