计算沿任意渐变的点的颜色
我正在尝试编写一个“应用渐变”函数,该函数需要一些点和一个线性渐变并计算每个点的颜色。 我有这样的事情(给定一个points
的数组和由两个点start
和end
定义的梯度):
struct Colour {
float red; float green; float blue;
};
struct Point {
int x; int y;
Colour colour;
};
Point points[total_points] = { ... };
Point start = { ... };
Point end = { ... };
for (int i=0; i<total_points; i++) {
// Get normalised position along x and y
float scale_x = end.x-start.x;
float pos_x = (scale_x == 0) ? 0 : (points[i].x-start.x) / scale_x;
float scale_y = end.y-start.y;
float pos_y = (scale_y == 0) ? 0 : (points[i].y-start.y) / scale_y;
// Average the positions
float pos = .5 * (pos_x + pos_y);
// Blend colours
points[i].colour = blend_colour(start.colour, end.colour, pos);
}
我的颜色混合功能就像这样简单:
static Colour blend_colour(Colour start, Colour end, float position) {
Colour blend;
blend.red = (start.red * (1-position)) + (end.red * position);
blend.green = (start.green * (1-position)) + (end.green * position);
blend.blue = (start.blue * (1-position)) + (end.blue * position);
return blend;
}
我在for循环中的数学绝对不是很正确 - 我需要使用三角函数来计算颜色吗?
代替
// Average the positions
float pos = .5 * (pos_x + pos_y);
尝试
// Get scaled distance to point by calculating hypotenuse
float dist = sqrt(pos_x*pos_x + pos_y*pos_y);
另外,虽然编译器会为您完成,但您应该将缩放因子从循环中提取出来。 实际上,计算距离的比例因子可能会更好:
Point start = { ... };
Point end = { ... };
float xdelta = end.x - start.x;
float ydelta = end.y - start.y;
float hypot = sqrt(xdelta*xdelta + ydelta*ydelta);
for (int i=0; i<total_points; i++) {
// Get normalised distance to points[i]
xdelta = points[i].x - start.x;
ydelta = points[i].y - start.y;
float dist = sqrt(xdelta*xdelta + ydelta*ydelta);
if (hypot) dist /= hypot;
// Blend colours
points[i].colour = blend_colour(start.colour, end.colour, dist);
}
链接地址: http://www.djcxy.com/p/71075.html
上一篇: Calculate colours for points along an arbitrary gradient