生成径向渐变的算法

时间:2010-06-09 20:39:15

标签: c++ c algorithm gradient

我在这里有这个算法:

pc = # the point you are coloring now
p0 = # start point
p1 = # end point
v = p1 - p0
d = Length(v)
v = Normalize(v) # or Scale(v, 1/d)

v0 = pc - p0

t = Dot(v0, v)
t = Clamp(t/d, 0, 1)

color = (start_color * t) + (end_color * (1 - t))

生成点对点线性渐变。它对我很有用。我想知道是否有类似的算法来生成径向渐变。类似地,我的意思是在点P处求解颜色而不是在某种颜色处求解P(其中P是您正在绘制的坐标)。

由于

3 个答案:

答案 0 :(得分:3)

//loop through vector
//x and y px position
int x = i%w;
int y = i/w;
float d = distance(center,int2(x,y));
//if within the grad circle
if(d < radius)
{
  //somehow set v[i] alpha to this:
  float a = d/r;
}

答案 1 :(得分:1)

在atan2(dy,dx)上划线,其中dx是x中心,dy是y中心。

cx # center x
cy # center y

r1 # ring is defined by two radius
r2 #  r1 < r2

c1 # start color
c2 # stop color

ang # start angle 

px # currect point x,y
py 
if( px^2 + py^2 <= r2^2 AND px^2 + py^2 >= r1^2  )  # lies in ring?
    t= atan2(py-cy,px-cx)+ang
    t= t+ pi # atan2 is from -pi to pi
    if (t > 2* pi) # it might over 2pi becuse of +ang
       t=t-2*pi
    t=t/(2*pi) # normalise t from 0 to 1
    color = (c1 * t) + (c2 * (1 - t))

问题在于这个算法是ang实际上是错误的,应该用pi旋转并在0到2pi之间归一化。

答案 2 :(得分:0)

根据评论,您想要的仍然可以被视为线性渐变 - 即您有一条从圆心到圆心的线,并且沿着该线有一个线性渐变。因此,计算几乎与您已有的计算相同。

编辑:好的,显然我误解了你想要的东西。要想象一个围绕半径运行的渐变,你仍然基本上线性化它 - 计算出该半径的圆周(2 * Pi * R),然后沿着该长度的线进行线性插值。