顺畅的颜色插值沿着" bresenham"线

时间:2014-09-16 20:39:55

标签: java graphics colors gradient

我试图沿着一条线插入颜色,这样,给定两个点及其各自的RGB值,我可以绘制一条具有平滑颜色渐变的线条。使用Bresenham的线算法,我现在可以画线,但不知道如何开始在两个端点之间插入颜色。以下是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值。我正在考虑像 x增量一样的东西,查看每个rgb值并决定是否要操纵它们

我初始化了rStart和rEnd(依此类推g和b),但不知道从哪里开始。任何形式的帮助或建议将不胜感激!

编辑:感谢@Compass提供了很棒的建议!现在我在尝试实施该策略时碰到了另一个,我几乎肯定这是一个容易犯的错误。我现在无法看到它。出于某种原因,我的 pColor 总是返回0,我不知道为什么。我运行了一些打印语句以确保xCount确实在增加,所以我不确定还有什么可以使这个变量始终为0。

2 个答案:

答案 0 :(得分:3)

我记得在学习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值。

答案 1 :(得分:2)

实际上你也会在RGB空间中绘制线条!

Bresenham让您计算从(X0,Y0)到(X1,Y1)的点坐标。

这是通过X或Y上的循环完成的,在另一个坐标上进行线性插值。

只需将算法扩展为从(X0,Y0,R0,G0,B0)到(X1,Y1,R1,G1,B1),在X或Y上的相同循环中绘制一条线,并进行线性插值其他坐标。