我在这里有这个算法:
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是您正在绘制的坐标)。
由于
答案 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),然后沿着该长度的线进行线性插值。