Написал достаточно сложную функцию. Куда ее деть, чтобы не потерялась в веках?
Что делает:
Cчитает уровень градиента в заданной точке. Задается A(x1, y1), B(x2, y2) - линия градиента, значения от 0 до 255. Также задается точка T(tx, ty) и считается значение градиента в этой точке.
Код:
http://paste.org.ru/?3ux5ln
Код без комментариев:
unsigned char GradientValue(int x1, int y1, int x2, int y2, int tx, int ty)
{
if ((x1 == x2) && (y1 == y2))
return 0;
float AB_A = y2 - y1;
float AB_B = x1 - x2;
float NAB_A = AB_B;
float NAB_B = -AB_A;
float NAB_C = -NAB_A * x1 - NAB_B * y1;
if ((NAB_A * x2 + NAB_B * y2 + NAB_C) *
(NAB_A * tx + NAB_B * ty + NAB_C) <= 0)
return 0;
NAB_C = -NAB_A * x2 - NAB_B * y2;
if ((NAB_A * x1 + NAB_B * y1 + NAB_C) *
(NAB_A * tx + NAB_B * ty + NAB_C) <= 0)
return 255;
float Dx = (x1*(y2-y1)*(y2-y1)+tx*(x2-x1)*(x2-x1)+(x2-x1)*(y2-y1)*(ty-y1)) /
((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
float Dy = (x2-x1)*(tx-Dx) /
(y2-y1) + ty;
float AD = sqrroot((Dx-x1)*(Dx-x1)+(Dy-y1)*(Dy-y1));
float AB = sqrroot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
float Ratio = (AD / AB) * 255;
return (unsigned char)Ratio;
}
Пример применения:
int x, y;
int basecolor = SML_COLOUR_RED;
int transcolor = SML_COLOUR_BLUE;
unsigned char alpha;
int colour;
for (x = 0; x < 500; x++)
for (y = 0; y < 500; y++)
{
alpha = SmlGradientValue(50, 50, 450, 450, x, y);
colour = SML_COL_MIX(basecolor, transcolor, alpha);
SmlImagePixelSet(img1, colour, x, y);
}
Результат:
https://dl.dropboxusercontent.com/u/31471800/p2p/grad.png
Перемещено mono из talks