Алгоритм генерации радиального градиента - PullRequest
1 голос
/ 10 июня 2010

У меня есть этот алгоритм здесь:

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 ]

3 голосов
/ 27 апреля 2011
//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 голос
/ 10 июня 2010

Построение над 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.

0 голосов
/ 10 июня 2010

Исходя из комментария, то, что вы хотите, все еще может рассматриваться как линейный градиент - то есть у вас есть линия от центра к внешней стороне круга, и у вас есть линейный градиент вдоль этой линии. Таким образом, расчет практически идентичен тому, что вы уже имели.

Редактировать: Хорошо, видимо, я неправильно понял, что вы хотите. Чтобы изобразить градиент, бегущий вокруг радиуса, вы все равно в основном его линеаризуете - вычислите окружность в этом радиусе (2 * Pi * R), а затем выполните линейную интерполяцию вдоль линии этой длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...