SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
サンプルプログラムの実行例
サンプルプログラムの実行例

はじめに

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

対象読者

 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からダウンロードできます(ソースコードは記事上部)。

まとめ

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

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

斉藤 努(サイトウ ツトム)

C#プログラマ

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/185 2006/05/11 11:19

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング