【问题标题】:Using subtraction from integers to make a linear line gradient使用整数减法制作线性线渐变
【发布时间】:2018-12-10 18:46:51
【问题描述】:

我一直在修改这段代码,试图让这条参数线根据线的长度从洋红色到青色渐变(所以它不会被短线截断,或者也会发生很快在更长的线上)我正在尝试找出公式来找到我要减去的内容,但我似乎无法弄清楚,有什么想法吗?

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

编辑:这里是供那些询问的人使用的 Lerp 函数-

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

【问题讨论】:

  • 什么是 LERP() 函数/宏?您的代码不完整。当部分代码不在这里时,我们应该如何知道您的代码做了什么?
  • 好了,这只是一个基本的 Lerp 函数。

标签: c++ colors line linear-gradients


【解决方案1】:

你在你的代码中做了很糟糕的事情。如果要对线进行光栅化,最简单的方法是使用DDA algorithm(有时称为 Bresenham 算法),它不需要浮点运算,也不会多次绘制相同的点。

这是相同概念的another explanation

这里是yet another one,其中包含 C 代码。

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

【讨论】:

  • 我已经在另一行代码中使用了 Bresenham,但我应该让参数代码成为带有渐变的代码。另外,你的意思是我可以使用 Bresenham 算法本身在颜色之间慢慢切换?
  • 我试过你说的但没用*。另外如果你能说出代码中的糟糕之处,我想知道哪里出了问题,以提高我的编码效率。 *我基本上取自第一个链接,并用颜色差异替换了 dy。 (看到最长已经是 X 或 Y)
  • @NicholasHatcher “没用”不是很具体,除非您能够分享更多细节,否则我无法告诉您要解决什么问题。从用 DDA 替换浮点计算开始,一旦完成,您就可以对颜色计算执行相同的操作 - 将颜色视为另一个坐标。
  • 我确实分享了更多细节,因此使用了 *,我在评论中提到了我稍后所做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多