плавная цветовая интерполяция вдоль линии" bresenham"



Я пытаюсь интерполировать цвет вдоль линии так, чтобы, учитывая две точки и их соответствующие значения RGB, я мог нарисовать линию с плавным цветовым градиентом. Используя линейный алгоритм Бресенхема, я теперь могу рисовать линии, но не знаю, как начать интерполировать цвета между двумя конечными точками. Ниже приведена часть функции drawLine (), которая работает для всех линий, наклон которых меньше 1.



    int x_start = p1.x, x_end = p2.x, y_start =p1.y, y_end = p2.y;
int dx = Math.abs(x_end-x_start), dy = Math.abs(y_end-y_start);

int x = x_start, y = y_start;
int step_x = x_start < x_end ? 1:-1;
int step_y = y_start < y_end ? 1:-1;

int rStart = (int)(255.0f * p1.c.r), rEnd = (int)(255.0f * p2.c.r);
int gStart = (int)(255.0f * p1.c.g), gEnd = (int)(255.0f * p2.c.g);
int bStart = (int)(255.0f * p1.c.b), bEnd = (int)(255.0f * p2.c.b);

int xCount = 0;


//for slope < 1
int p = 2*dy-dx;
int twoDy = 2*dy, twoDyMinusDx = 2*(dy-dx);
int xCount = 0;

// draw the first point
Point2D start = new Point2D(x, y, new ColorType(p1.c.r, p1.c.g, p1.c.b));
drawPoint(buff, start);

float pColor = xCount / Math.abs((x_end - x_start));
System.out.println(x_end + " " + x_start);

while(x != x_end){
x+= step_x;
xCount++;
if(p<0){
p+= twoDy;
}
else{
y += step_y;
p += twoDyMinusDx;
}

Point2D draw_line = new Point2D(x, y, new ColorType(p1.c.r*(1-pColor)+p2.c.r*pColor,p1.c.g*(1-pColor)+p2.c.g*pColor,p1.c.b*(1-pColor)+p2.c.b*pColor));
System.out.println(pColor);
drawPoint(buff,draw_line );
}


Итак, я думаю, что, как и рисование линий, мне также нужно что-то вроде параметр решения p для определения времени изменения значений RGB. Я думаю о чем-то вдоль линий AS x инкрементов, смотрю на каждое значение rgb и решаю, хочу ли я манипулировать ими или нет.



Я инициализировал rStart и rEnd(и так далее для g и b), но понятия не имею, с чего начать. любая помощь или предложения будут высоко оценены!



Edit: спасибо @Compass за отличное предложение ! Теперь я столкнулся с другим, пытаясь реализовать эту стратегию., и я почти уверен, что это легкая ошибка. Я просто не могу сейчас этого видеть. По какой-то причине мой pColor всегда возвращает 0, я не знаю, почему. Я запустил несколько операторов печати, чтобы убедиться, что xCount действительно увеличивается, поэтому я не уверен, что еще могло бы сделать эту переменную всегда 0.

611   2  

2 ответов:

Я помню, что понял это еще тогда, когда изучал GUI! Я объясню вам Основные понятия.

Допустим, у нас есть два цвета, RGB(A, B, C) и RGB (X, Y, Z) для простоты.

Если мы знаем положение в процентах (мы будем называть это P, поплавок 0 для начала, 1.0 в конце) вдоль линии, мы можем вычислить, какой цвет должен быть там, используя следующее:

Resultant Color = RGB(A*(1-P)+X*P,B*(1-P)+Y*P,C*(1-P)+Z*P)
Другими словами, вы усредняете отдельные значения RGB вдоль линии.

На самом деле вы также будете рисовать линию в пространстве RGB !

Bresenham позволяет вычислять координаты точек от (X0, Y0) до (X1, Y1).

Это делается петлей по X или Y, с линейной интерполяцией по другой координате.

Просто расширьте алгоритм, чтобы нарисовать линию от (X0, Y0, R0, G0, B0) до (X1, Y1, R1, G1, B1), в том же цикле на X или Y, с линейной интерполяцией по другим координатам.

Comments

    Ничего не найдено.