12. 模様を描く¶
円や長方形をループを使って並べ、模様を描く方法を学びます。
12.1 円を並べる¶
for
ループと図形描画を組み合わせて、短いコードでたくさんの図形を描くことができます
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(Palette::White);
while (System::Update())
{
for (int32 i = 0; i < 6; ++i)
{
Circle{ (i * 100), 100, 30 }.draw(Palette::Skyblue);
}
for (int32 i = 0; i < 6; ++i)
{
Circle{ (50 + i * 100), 200, 30 }.draw(Palette::Seagreen);
}
}
}
12.2 二重ループで円を並べる¶
- 横に図形を並べるループを、さらに縦に並べるループで包むことで、縦横に図形を並べることができます
- 横方向のループ変数は
x
, 縦方向のループ変数はy
という名前にするとわかりやすいです
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(Palette::White);
while (System::Update())
{
for (int32 y = 0; y < 4; ++y) // 縦方向
{
for (int32 x = 0; x < 6; ++x) // 横方向
{
Circle{ (x * 100), (y * 100), 30 }.draw(Palette::Skyblue);
}
}
}
}
12.3 少し複雑にする¶
- 二重ループ内のループ変数
x
,y
に着目し、その和が奇数か偶数かで図形を変化させると、さらに複雑な模様を描くことができます - ある整数
n
が偶数であるかは(n % 2) == 0
で判定できます - 整数
n
が偶数であるかをbool
型で返すIsEven(n)
という関数も用意されています
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(Palette::White);
while (System::Update())
{
for (int32 y = 0; y < 4; ++y)
{
for (int32 x = 0; x < 6; ++x)
{
if (IsEven(x + y)) // x + y が偶数なら
{
// 大きい円を描く
Circle{ (x * 100), (y * 100), 30 }.draw(Palette::Skyblue);
}
else // 奇数なら
{
// 小さい円を描く
Circle{ (x * 100), (y * 100), 10 }.draw(Palette::Skyblue);
}
}
}
}
}
12.4 長方形を並べる¶
- 柱のように長方形を並べます
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(Palette::White);
while (System::Update())
{
for (int32 x = 0; x < 6; ++x)
{
Rect{ (x * 100), 0, 80, 600 }.draw(Palette::Skyblue);
}
}
}
12.5 サイズを徐々に変える¶
- ループ変数
x
が大きくなるにつれて、長方形の長さが徐々に大きくなるようにします
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(Palette::White);
while (System::Update())
{
for (int32 x = 0; x < 6; ++x)
{
Rect{ (x * 100), 0, 80, ((x + 1) * 100) }.draw(Palette::Skyblue);
}
}
}
12.6 色を徐々に変える¶
- ループ変数
x
が大きくなるにつれて、色が徐々に変わるようにします
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(Palette::White);
while (System::Update())
{
for (int32 x = 0; x < 6; ++x)
{
Rect{ (x * 100), 0, 80, 600 }.draw(ColorF{ 0.0, (x * 0.15), (x * 0.15) });
}
}
}
12.7 色相を徐々に変える¶
- ループ変数
x
が大きくなるにつれて、色相が徐々に変わるようにします - 最も左の長方形と最も右の長方形は、色相がそれぞれ 0, 360 で同じ色です
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(Palette::White);
while (System::Update())
{
for (int32 x = 0; x < 10; ++x)
{
Rect{ (x * 80), 0, 80, 600 }.draw(HSV{ (x * 40), 0.5, 1.0 });
}
}
}
🧩 練習¶
次のような模様を描いてみましょう
練習 ① 波紋¶
ヒント
Circle
の半径を徐々に変えます
解答例
練習 ② 市松模様¶
ヒント
- 2 重ループを使います
x
とy
の偶奇で色を変えます
解答例
練習 ③ マス目¶
ヒント
- 2 重ループを使います
Rect
の.drawFrame()
で枠を描きます- あるいは
Rect
の.draw()
で内部を塗りつぶします
解答例 1
解答例 2
振り返りチェックリスト¶
- ループと図形描画を組み合わせて、図形を並べて描く方法を学んだ
- 二重ループを使って、縦横に図形を並べる方法を学んだ
- ループ変数を活用して、サイズや色などに変化をつける方法を学んだ