周期R,G,B值为HUE?
我使用SFML,它有一个颜色函数,它采用RGB值。例子..(255,0,0)。我希望能够通过循环循环这些数字,以便显示的颜色通过色调循环...周期R,G,B值为HUE?
因此,如果我正在使用(76,204,63),该功能将调整这3个数字。所以我需要将rgb转换成HSV的功能,然后返回rgb。
任何想法,我会怎么做呢?
的SFML代码,我想用的是...
_sprite.setColor(76,204,63);这将把精灵设置为一种颜色......我可能试图弄清楚一旦这些数字完成后,通过色调循环颜色。
用google搜索一下,我发现了this的答案,并将代码转换为C++并记住了SFML。 我正在四处转悠,所以随时让它变得更好。我想应该甚至可以取代3x3阵列。
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;
}
按住[Shift RGB颜色的色调]的
杰瑞上面的答案是一个正确的方法。如果你不关心保持亮度(如果你这么做 - 也不要使用HSV),你可以简单地沿着R = G = B轴旋转RGB颜色。这只是一个矩阵乘法,并且可以节省您从HLS或HSV空间进行的转换。
请问您可以扩展一下吗?我不是100%确定我理解你。 – aJynks 2012-07-12 19:21:32
您可以将RGB值看作由R轴,G轴和B轴定义的空间中的3D点。然后,您可以围绕任意轴旋转该3D点(以及任何方向的无限线,穿过原点)。有关如何进行任意旋转的详细信息,请参见[这里](http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/)。最后的矩阵看起来很可怕,但一旦计算了一次正弦和余弦,它就变得非常简单。请记住在进行计算之前对矢量进行标准化。 – user1118321 2012-07-12 19:44:24
这很容易看到这是如何工作的大旋转。假设我们以{50,100,150}开始。我们可以将它旋转到{150,50,150},然后再旋转到{100,150,50}。这种旋转相当于乘以矩阵{{0,1,0},{0,0,1},{1,0,0}}。 – MSalters 2012-07-13 08:26:24
可能重复(http://stackoverflow.com/questions/8507885/shift-hue-of-an-rgb-color) – MasterHD 2015-09-15 10:52:21