C++ 使用整数减法生成线性线渐变

C++ 使用整数减法生成线性线渐变,c++,colors,line,linear-gradients,C++,Colors,Line,Linear Gradients,我一直在破解这段代码,试图让这条参数线根据线的长度从洋红渐变到青色(这样它就不会被一条短线截断,或者在一条较长的线上发生得太快),我试图找出公式,找到我要减去的东西,但我似乎无法理解,有什么想法吗 void ParametricLine(unsigned int _X1, unsigned int _Y1, unsigned int _X2, unsigned int _Y2) { unsigned int lengthX; unsigned i

我一直在破解这段代码,试图让这条参数线根据线的长度从洋红渐变到青色(这样它就不会被一条短线截断,或者在一条较长的线上发生得太快),我试图找出公式,找到我要减去的东西,但我似乎无法理解,有什么想法吗

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;
}

你在代码中做了一些可怕的事情。如果要栅格化线条,最简单的方法是使用(有时称为Bresenham算法),它不需要浮点运算,也不需要多次绘制相同的点

这是一个相同的概念

下面是C代码


阅读所有提到的页面后,将颜色视为坐标之一,并对颜色应用完全相同的DDA算法。

什么是LERP()函数/宏?您的代码不完整。当部分代码不在这里时,我们怎么知道你的代码做了什么?好了,这只是一个基本的Lerp函数。我已经在另一行代码中使用了Bresenham,但我应该让参数代码是一个有梯度的代码。还有,你的意思是我可以使用Bresenham算法本身来慢慢地在颜色之间切换?我试过你说的,但没用*。另外,如果你能说出代码中的糟糕之处,我想知道哪里出了问题,以便提高我的编码效率*我基本上从第一个链接开始,用不同的颜色替换了dy。(因为最长的已经是X或Y)@NicholasHatcher“不起作用”不是很具体,除非你能分享更多细节,否则我无法告诉你要修复什么。从用DDA替换浮点计算开始,一旦完成,你就可以用颜色计算来做同样的事情——考虑颜色只是另一个坐标。我已经分享了更多的细节,因此使用了*,我提到了我在评论中所做的。
unsigned int LERP(unsigned int _startval, unsigned int _endval, float _ratio){
return (((int)_endval - (int)_startval) * _ratio + (int)_startval);}