Написал достаточно сложную функцию. Куда ее деть, чтобы не потерялась в веках?
Что делает:
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






