循环的R,G,B作为VALES HUE?(Cycle R,G,B vales as HUE?)

2019-09-19 10:21发布

我使用SFML,它有一个颜色函数,它的RGB值。 例如..(255,0,0)。 我希望能够循环这些数字虽然循环,使显示的颜色周期虽然色调...

所以,如果我使用(76,204,63)的功能将调整这些3个数字。 所以,我需要的功能,以摄取RGB转换为HSV然后返回RGB。

任何想法如何,我会去吗?

在SFML代码,我想用的是...

_sprite.setColor(76,204,63); 这将精灵设置为一个颜色......我是个想一旦与这些数字做循环的颜色,虽然色调,以解决如何。

Answer 1:

随着Google检索我发现这个答案,并考虑与SFML转换的代码,以C ++。 我周围浇铸相当严重,可以随意做的更好。 我想这甚至应该有可能取代3×3阵列。

sf::Uint8 clampAndConvert(float v)
{
    if(v < 0)
        return 0;
    if( v > 255)
        return 255;
    return static_cast<sf::Uint8>(v);
}

sf::Color RGBRotate(sf::Color old, float degrees)
{
    float cosA = cos(degrees*3.14159265f/180);
    float sinA = sin(degrees*3.14159265f/180);
    float rot = 1.f/3.f * (1.0f - cosA) + sqrt(1.f/3.f) * sinA;

    float rx = old.r * (cosA + (1.0f - cosA) / 3.0f) + old.g * rot + old.b * rot;
    float gx = old.r * rot + old.g * (cosA + 1.f/3.f*(1.0f - cosA)) + old.b * rot;
    float bx = old.r * rot + old.g * rot + old.b * cosA + 1.f/3.f * (1.0f - cosA);

    return sf::Color(clampAndConvert(rx), clampAndConvert(gx), clampAndConvert(bx), old.a);
}

编辑:删除不必要的转换。

编辑:摆脱了矩阵。

编辑:我注意到代码中并没有真正的工作通缉,但在这里是完美的作品硬编码的解决方案,只是不是紧凑,美观大方。

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow Screen (sf::VideoMode (800, 600, 32), "Game", sf::Style::Close);
    Screen.setFramerateLimit(60);

    sf::RectangleShape rect(sf::Vector2f(350.f, 350.f));
    rect.setPosition(150, 150);

    int dr = 0;
    int dg = 0;
    int db = 0;

    sf::Uint8 r = 255, g = 0,  b = 0;

    while (Screen.isOpen())
    {
        sf::Event Event;
        while (Screen.pollEvent (Event))
        {
            if (Event.type == sf::Event::Closed)
                Screen.close();
        }

        r += dr;
        g += dg;
        b += db;

        if(r == 255 && g == 0 && b == 0)
        {
            dr = 0; dg = 1; db = 0;
        }

        if(r == 255 && g == 255 && b == 0)
        {
            dr = -1; dg = 0; db = 0;
        }

        if(r == 0 && g == 255 && b == 0)
        {
            dr = 0; dg = 0; db = 1;
        }

        if(r == 0 && g == 255 && b == 255)
        {
            dr = 0; dg = -1; db = 0;
        }

        if(r == 0 && g == 0 && b == 255)
        {
            dr = 1; dg = 0; db = 0;
        }

        if(r == 255 && g == 0 && b == 255)
        {
            dr = 0; dg = 0; db = -1;
        }

        rect.setFillColor(sf::Color(r, g, b));

        Screen.clear();
        Screen.draw(rect);
        Screen.display();
    }

    return 0;
}


Answer 2:

转换RGB到HSL或HSV ,修改色调,然后将结果转换回RGB 。



Answer 3:

上述杰里的回答是一个正确的做法。 如果你不关心保持亮度(如果你这样做 - 不使用HSV,要么),你可以简单地沿着R = G = B轴旋转你的RGB颜色。 这仅仅是一个矩阵乘法,并节省您的转换和从HLS或HSV空间。



文章来源: Cycle R,G,B vales as HUE?
标签: c++ rgb hsv