【问题标题】:smooth color interpolation along a "bresenham" line沿“bresenham”线平滑颜色插值
【发布时间】:2014-11-10 17:59:16
【问题描述】:

我试图沿一条线插入颜色,以便给定两个点及其各自的 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。

【问题讨论】:

  • 你可以看看this example和this example
  • 对于与此 API 无关的问题,请停止使用标签“jogl”。真的很烦人。

标签: java graphics colors gradient


【解决方案1】:

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

【讨论】:

  • 谢谢!!我还有一个简短的问题。我编辑了这个问题,所以如果你能看一下就好了。
  • 不编译代码,相信和强制转换有关。 xCount 和 Math.abs 都是整数,我相信这会导致在除法上转换为整数。需要强制转换为浮点数。
【解决方案2】:

实际上你也会在 RGB 空间中画线!

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

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

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

【讨论】:

  • 是的,还有一个优化提示:如果您确实优化了 Bresenham(使用整数算术 f.i.),那么您可以重复使用相同的技巧进行颜色分量插值。
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多