はじめに
本稿では、小学生が遊び感覚で、県の名前を覚えられる「県当てクイズ」を作成します。このプログラムでは、問題に出された県がある場所を、制限時間以内に地図をクリックして回答します。ポイントは、ある点が図形に含まれるかを判定する方法です。
対象読者
C#の初心者プログラマを想定しています。
必要な環境
Visual Studio .NET 2003など。
県の判定
前出の通り、このプログラムでは地図をクリックして県の場所を回答します。クリックしたポイントが、どの県かを判定するにはどうしたらよいでしょうか? 県の形の多角形データがあれば、次の方法で判定ができます。
アルゴリズムその1 - 指定した点が多角形内に含まれるかどうかの判定
- 多角形の各線分ごとに、指定した点を通るx軸に平行な線との交点があるかどうかを調べ、交点が指定した点より右にあれば、カウントします。
- カウントした点が奇数なら指定した点は多角形に含まれています。
県の形の多角形データは、国土数値情報ダウンロードサービスから取得可能ですが、このアルゴリズムを実装するのは大変そうです。
より簡単な方法をして、ピクセル形式の画像を使った次の方法が考えられます。
アルゴリズムその2 - 指定した点が対象図形に含まれるかどうかの判定
- あらかじめ、画像データの対象図形を特定の色(たとえば「赤」)で塗っておきます。
- 指定した点にある画像データのピクセル値を調べ、指定した色(この場合、「赤」)と同じならば対象図形に含まれています。
これなら県がどんな形をしていても、比較的簡単に実装できます。ピクセル形式の日本地図は、インターネットなどから探してみましょう。ここでは、T.Takeda氏の白地図を利用します。
県を塗り分けるコツ
すべての県は違う色で塗り分ける必要がありますが、色のない白地図の方が県名を暗記するのに都合がよさそうです。そこで、微妙に色が異なる、限りなく白に近い色で塗り分けることにします。
色は、1都2府43県とそれ以外(海など)で、最低でも47色必要です。白色は(R, G, B) = (255, 255, 255)なので、R・G・Bを255~252の4段階に変化させて、4×4×4=64色作ることにします。
各県に塗る色は、県コードを元に次の式で決定します(県ごとに色を塗る作業は、ペイントソフトなどで頑張りましょう)。
県コードi(1から47)に対応する色 = Color.FromArgb(255 - i/16, 255 - (i/4)%4, 255 - i%4);
また、指定した点に対する県コードは、次の式で求められます。
Color c = bitmap.GetPixel(x, y); 県コードi = (255-c.R)*16 + (255-c.G)*4 + (255-c.B);
なお、実際に作成したプログラム「PrefMaster 県当てクイズ」は、Vectorからダウンロードできます(ソースコードは記事上部)。
まとめ
県の判定を通して、「指定した点が対象図形に含まれるかどうかの判定方法」を考えました。