1

私はここにこのアルゴリズムを持っています:

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で色を解くものを意味します。

ありがとう

4

3 に答える 3

1

dx が x 中心、dy が y 中心である atan2(dy,dx) 上の直線。

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))

このアルゴリズムの問​​題は、角度が実際には間違っていて、pi で回転させて 0 から 2pi の間で正規化する必要があることです。

于 2010-06-09T23:01:15.317 に答える
0

コメントに基づいて、必要なものは引き続き線形グラデーションとして表示できます。つまり、円の中心から外側までの線があり、その線に沿って線形グラデーションがあります。そのため、計算はすでに行ったものと実質的に同じです。

編集:わかりました、どうやら私はあなたが望むものを誤解していました. 半径の周りを走る勾配を計算するには、基本的にそれを線形化します。その半径 (2*Pi*R) での円周を計算し、その長さの線に沿って線形補間を行います。

于 2010-06-09T20:47:12.557 に答える