Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

点が対象図形に含まれるかどうかを判定するアイデア

白地図を利用した県名当てクイズの作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/10/17 17:30

県名を当てるクイズの作成を通して、指定した点が対象図形に含まれるかどうかを判定する際のアイデアを紹介します。

サンプルプログラムの実行例
サンプルプログラムの実行例

はじめに

 本稿では、小学生が遊び感覚で、県の名前を覚えられる「県当てクイズ」を作成します。このプログラムでは、問題に出された県がある場所を、制限時間以内に地図をクリックして回答します。ポイントは、ある点が図形に含まれるかを判定する方法です。

対象読者

 C#の初心者プログラマを想定しています。

必要な環境

 Visual Studio .NET 2003など。

県の判定

 前出の通り、このプログラムでは地図をクリックして県の場所を回答します。クリックしたポイントが、どの県かを判定するにはどうしたらよいでしょうか? 県の形の多角形データがあれば、次の方法で判定ができます。

アルゴリズムその1 - 指定した点が多角形内に含まれるかどうかの判定

  1. 多角形の各線分ごとに、指定した点を通るx軸に平行な線との交点があるかどうかを調べ、交点が指定した点より右にあれば、カウントします。
  2. カウントした点が奇数なら指定した点は多角形に含まれています。

 県の形の多角形データは、国土数値情報ダウンロードサービスから取得可能ですが、このアルゴリズムを実装するのは大変そうです。

 より簡単な方法をして、ピクセル形式の画像を使った次の方法が考えられます。

アルゴリズムその2 - 指定した点が対象図形に含まれるかどうかの判定

  1. あらかじめ、画像データの対象図形を特定の色(たとえば「赤」)で塗っておきます。
  2. 指定した点にある画像データのピクセル値を調べ、指定した色(この場合、「赤」)と同じならば対象図形に含まれています。

 これなら県がどんな形をしていても、比較的簡単に実装できます。ピクセル形式の日本地図は、インターネットなどから探してみましょう。ここでは、T.Takeda氏の白地図を利用します。

T.Takeda氏の白地図
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からダウンロードできます(ソースコードは記事上部)。

まとめ

 県の判定を通して、「指定した点が対象図形に含まれるかどうかの判定方法」を考えました。

参考資料

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5