Использование вычитания из целых чисел для создания линейного градиента линии - PullRequest
0 голосов
/ 02 июля 2018

Я взламывал этот код, пытаясь заставить эту параметрическую линию сделать градиент от пурпурного к голубому на основе длины линии (чтобы она не отсекалась короткой линией или не происходила слишком скоро по длинной линии) Я пытаюсь найти формулу, чтобы найти то, что я бы вычитал, но я не могу понять, какие-нибудь идеи?

void ParametricLine(unsigned int _X1, unsigned int _Y1,
                unsigned int _X2, unsigned int _Y2)
{

    unsigned int lengthX;
    unsigned int lengthY;

    lengthX = abs((int)_X2 - (int)_X1);
    lengthY = abs((int)_Y2 - (int)_Y1);

    int longest;
    if (lengthX > lengthY)
    {
        longest = lengthX;
    }
    else
    {
        longest = lengthY;
    }

    unsigned int color = 16711935; //magenta is green 0, others 255
    unsigned int magenta = 16711935; //magenta is green 0, others 255

    unsigned int cyan = 65535;  //cyan is red = 0, G & B are 255
    //all 255 = 16777215

    unsigned int colorsubtract = (magenta - cyan)/longest;

    //MAGENTA: R: 255, G: 0,   B: 255
    //CYAN:    R:0,    G: 255, B: 255

    for (int i = 0; i < longest; i++)
    {
        float Ratio = (float)i / longest;

        unsigned int CurrY = LERP(_Y1, _Y2, Ratio);
        unsigned int CurrX = LERP(_X1, _X2, Ratio);
        /*color = LERP(16711935, 65535, longest/65535);*/
        if (color > cyan)
            color = color - colorsubtract;
        else if (color < cyan)
            color = cyan;

        //interpolate from magenta to cyan
        raster[Position(CurrX, floor(CurrY + 0.5))] = color;
    }
    raster[Position(_X1, _Y1)] = 16777215;
    raster[Position(_X2, _Y2)] = 16777215;
}

edit: вот функция Lerp для тех, кто спрашивает -

unsigned int LERP(unsigned int _startval, unsigned int _endval, float _ratio){
return (((int)_endval - (int)_startval) * _ratio + (int)_startval);}

1 Ответ

0 голосов
/ 02 июля 2018

Вы делаете ужасные вещи в своем коде. Если вы хотите растеризовать линию, проще всего будет использовать алгоритм DDA (иногда называемый алгоритмом Брезенхэма), который не требует арифметики с плавающей точкой и не рисует одни и те же точки несколько раз.

Вот другое объяснение того же понятия.

А вот еще один с включенным кодом С.

И как только вы прочитаете все упомянутые страницы, обработайте цвет как одну из координат и примените точно такой же алгоритм DDA для цвета.

...