我试图沿着一条线插入颜色,这样,给定两个点及其各自的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。
答案 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上的相同循环中绘制一条线,并进行线性插值其他坐标。