Algorithm 生成基于像素的螺旋梯度

Algorithm 生成基于像素的螺旋梯度,algorithm,graphics,geometry,processing,gradient,Algorithm,Graphics,Geometry,Processing,Gradient,我有一个程序,可以创建基于像素的渐变(这意味着它计算每个像素的渐变步长,然后在该步长计算颜色,然后给出该颜色的像素) 我想实现螺旋渐变(如下所示) 我的程序可以创建圆锥渐变(如下所示),其中每个像素根据其与中点之间的角度在渐变中指定一个步长(有效地将中点像素角度[0…2PI]映射到[0…1]) 在我看来,螺旋梯度是一个圆锥梯度,它应用了一些附加函数,其中给定像素的梯度步长不仅取决于角度,还取决于应用于中点和像素之间欧几里德距离的一些附加非线性函数 我设想一个解决方案将采用原始的(x,y)像素

我有一个程序,可以创建基于像素的渐变(这意味着它计算每个像素的渐变步长,然后在该步长计算颜色,然后给出该颜色的像素)

我想实现螺旋渐变(如下所示)

我的程序可以创建圆锥渐变(如下所示),其中每个像素根据其与中点之间的角度在渐变中指定一个步长(有效地将中点像素角度[0…2PI]映射到[0…1])

在我看来,螺旋梯度是一个圆锥梯度,它应用了一些附加函数,其中给定像素的梯度步长不仅取决于角度,还取决于应用于中点和像素之间欧几里德距离的一些附加非线性函数

我设想一个解决方案将采用原始的
(x,y)
像素坐标,并在x和y轴上将其置换一定量,从而产生一个新的坐标
(x2,y2)
。然后,对于每个像素,我只需计算中点与其新置换坐标(
x2,y2)
之间的角度,并将该角度用作该像素的渐变步长。但我需要的是这个位移函数。。。当然,可能还有其他更好的方法

下面是一个简单的从白色到黑色的圆锥渐变。我展示了我想象的位移是如何工作的,但是关于这个函数的细节(非线性),我无法实现

我的圆锥梯度代码:

public void conicGradient(Gradient gradient, PVector midPoint, float angle) {
    
    float rise, run;
    double t = 0;

    for (int y = 0, x; y < imageHeight; ++y) {
        rise = midPoint.y - y;
        run = midPoint.x;
        for (x = 0; x < imageWidth; ++x) {

            t = Functions.fastAtan2(rise, run) + Math.PI - angle;

            // Ensure a positive value if angle is negative.
            t = Functions.floorMod(t, PConstants.TWO_PI);

            // Divide by TWO_PI to get value in range 0...1
            step = t *= INV_TWO_PI;

            pixels[imageWidth * y + x] = gradient.ColorAt(step); // pixels is 1D pixel array

            run -= 1;
        }
    }
}
public void圆锥半径(渐变、PVector中点、浮动角度){
浮动上升,运行;
双t=0;
对于(int y=0,x;y用肉眼看,它看起来像是在t=。。。fastAtan2…
,您只需要:

t += PConstants.TWO_PI * Math.sqrt( (rise*rise + run*run) / (imageWidth * imageWidth + imageHeight * imageHeight) )

这只是添加了从中心到角度的距离,并进行了适当的缩放。

哦,就是这么简单…:D