色のいろんな作り方

Siv3D Advent Calendar 2013, 10 日目の記事です。
今日は Siv3D での色の作り方を紹介します。

Color 型のコンストラク

Color(Palette)

140 種類の Web カラーネーム が定義されています。

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw(Palette::Orange);
	}
}
Color(r, g, b)
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw({ 80, 240, 120 });
	}
}
Color(r, g, b, a)
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Rect(100, 100).draw();

		Circle(100, 100, 100).draw({ 80, 240, 120, 80 });
	}
}
Color(Palette, a)
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Rect(100, 100).draw();

		Circle(100, 100, 100).draw({ Palette::Red, 80 });
	}
}
Color(rgb)
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw(Color(120));

		Circle(100, 300, 100).draw(Color(220));
	}
}
Color(rgb, a)
# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Rect(100, 100).draw();

		Circle(100, 100, 100).draw({ 0, 180 });
	}
}
Color(String)

3 桁もしくは 6 桁の 16 進数カラーコードで色を表現します。

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw(Color(L"#F00"));

		Circle(100, 300, 100).draw(Color(L"#2580D0"));
	}
}

そのほかの便利な機能として
[0.0, 1.0] で各成分を表す ColorF 型

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw(ColorF(0.1, 0.6, 0.9));

		Circle(100, 200, 100).draw(ColorF(0.8));

		Circle(100, 300, 100).draw(ColorF(0.5, 0.4));
	}
}

HSV 表色系で色を表現する HSV

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw(HSV(60));

		Circle(100, 200, 100).draw(HSV(120, 0.5, 1.0));

		Circle(100, 300, 100).draw(HSV(240, 1.0, 0.8));
	}
}

Color(255,255,255,alpha) を返す Alpha(alpha) 関数

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw(HSV(0));

		Circle(100, 200, 100).draw(Alpha(120));
	}
}

HSV 型の演算

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Circle(100, 100, 100).draw(Color(0, 64, 160));

		Circle(100, 200, 100).draw(Color(0, 64, 160) + HSV(80, 0, 0));

		Circle(100, 300, 100).draw(Color(0, 64, 160) + HSV(0, 0.5, 0));

		Circle(100, 400, 100).draw(Color(0, 64, 160) + HSV(0, 0, 0.5));
	}
}

といった機能があります。
必要な色を最小限の書き方で得られるようになると便利です。

HSV 表色系のサンプル


マウスを動かすと色相が変化します。

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		for (int y = 0; y <= 10; ++y)
		{
			for (int x = 0; x <= 10; ++x)
			{
				const Color color = HSV(Mouse::Pos().x, x / 10.0, 1.0 - y / 10.0);

				Rect(20 + 40 * x, 20 + 40 * y, 40, 40).draw(color);
			}
		}
	}
}