Processing 处理如何根据草图中的位置改变颜色?

Processing 处理如何根据草图中的位置改变颜色?,processing,cellular-automata,Processing,Cellular Automata,我一直在尝试创建细胞自动机,在处理过程中使用摩尔邻域,到目前为止已经相当成功。我已经设法使基本系统工作,现在我希望通过添加不同的功能来使用它。现在,我检查细胞是否存活。如果是,我使用fill()函数应用一种颜色,然后我可能会根据单元格的存活时间改变该颜色的饱和度。但是,我希望能够根据活细胞的位置,比如 如图所示: 从表面上看,这似乎是一个方程式被用来实现这一效果,虽然我不完全确定。这件事已经困扰了我大约两天了。我不想要答案,因为我想自己去弄清楚。然而,如果有人能给我指出正确的方向,我将非常感激

我一直在尝试创建细胞自动机,在处理过程中使用摩尔邻域,到目前为止已经相当成功。我已经设法使基本系统工作,现在我希望通过添加不同的功能来使用它。现在,我检查细胞是否存活。如果是,我使用fill()函数应用一种颜色,然后我可能会根据单元格的存活时间改变该颜色的饱和度。但是,我希望能够根据活细胞的位置,比如

如图所示:

从表面上看,这似乎是一个方程式被用来实现这一效果,虽然我不完全确定。这件事已经困扰了我大约两天了。我不想要答案,因为我想自己去弄清楚。然而,如果有人能给我指出正确的方向,我将非常感激

现在,我已经将每个单元格作为类单元格的对象。在那里我存储了细胞的x,y坐标和当前的生存状态。它还包含一个
draw()
方法:

这将根据细胞是否存活而对其应用不同的颜色(年龄变量存储细胞存活时间的数值,以秒为单位)

这:

是目前为止输出的样子。正如我之前所说,我想让它看起来像第一个链接中的示例图像。

使用
noise(x,y)
根据每个单元格的坐标计算Perlin噪波值。绘制用于全局颜色渐变效果的单元格时,将此值映射到色调(或饱和度或亮度)


更新:生成更好地映射到整个光谱的噪波的示例代码(请参见vs)

{
最终浮点分辨率=0.0175f;
噪声尾(20);
彩色模式(HSB,1,1,1);
浮动[]色调=新浮动[宽度*高度];
loadPixels();
浮点数hueMax=0;
浮点数hueMin=1;
对于(intx=0;x最大值){
max=s[i];
}否则{
如果(色调[i]
您是否尝试过使用圆圈,然后使用if循环来对单元格进行相应的着色(如果在圆圈中)?圆圈可以工作,但在圆圈周围,颜色之间的过渡不是太苛刻吗?@Dwo在没有更多上下文/代码的情况下会很棘手。有几件事需要注意:1。如果
age
int
,则255/age进行整数除法:再次检查您是否得到预期值2。我假设您正在更改每个单元格的颜色模式(可能
colorMode(RGB)
应该在
else
块中?):请仔细检查某些内容是否覆盖了您的颜色模式/颜色…您可以尝试/隔离每个单元格的绘图样式(颜色模式和填充)。@GeorgeProfenza感谢您的提示!当我有时间的时候,我一定会仔细考虑你的建议。谢谢你,伙计!我以前从未听说过柏林噪声,所以我查了一下,把它应用到我的色调和饱和度中,我得到了一个程序,看起来和我试图模仿的程序非常相似。尽管如此,我唯一的问题是它生成的渐变中没有足够的黄色或青色。通常是红色、紫色、蓝色和绿色。我看了一下颜色选择器,发现与其他颜色相比,黄色和青色的色调范围非常窄。你知道有没有办法解决这个问题?我多次重画素描,都没能看到那么多青色,几乎没有黄色。@Dwo我也注意到了同样的事情。Perlin噪波值似乎在0-1(我看到很多青色(~0.5)和红色(~0,~1.0)之间分布不均匀,因此,这些值不会产生整个光谱。我更新了答案,介绍了一种为应用程序获得更好Perlin噪波的方法(通过重新映射,在噪波值极值处为未充分表示的颜色提供了更好的表示)。是的,因此我对noiseDetail()进行了一些处理,并设法获得了一些可以接受的颜色。我所做的只是调整noiseDetail()中的2个参数以及贴图()的最小值和最大值功能。我想我对这一切都很满意。谢谢你的帮助!@Dwo看起来不错。
{
    final float resolution = 0.0175f;
    noiseDetail(20);
    colorMode(HSB, 1, 1, 1);

    float[] hues = new float[width * height];

    loadPixels();

    float hueMax = 0;
    float hueMin = 1;

    for (int x = 0; x < width; x++) { // Create value hue per pixel.
        for (int y = 0; y < height; y++) {
            int i = (y * width) + x;

            hues[i] = noise(x * resolution, y * resolution); 

            if (hues[i] > max) {
                max = s[i];
            } else {
                if (hues[i] < min) {
                    min = hues[i];
                }
            }
        }
    }

    for (int x = 0; x < width; x++) { // Maps hue value to a more complete spectrum; updates PApplet pixels[].
        for (int y = 0; y < height; y++) {
            int i = (y * width) + x;

            float hue = map(hues[i], min/0.4f, max*0.9f, 0, 1); // constants found by experimenting

            pixels[i] = color(hue, 1, 1); // only map hues in this example
        }
    }

    updatePixels();
}