gihyo.jp » DEVELOPER STAGE » 連載 » Blogopolisから学ぶ計算幾何 » 第4回 平面走査法による線分の交差検出(中編)

Blogopolisから学ぶ計算幾何

第4回 平面走査法による線分の交差検出(中編)

この記事を読むのに必要な時間:およそ 3 ~ 4.5 分

はじめに

今回は,平面走査法による線分交差検出のデータ構造を実装していきます。内容がかなり難しくなってきますが,説明とソースコードを納得できるまで読み返していただければと思います。

平面走査法と水平方向

前回は,多数の線分から交差を検出する方法として,平面走査法(plane sweep algorithm)の考え方を紹介しました。これは,x軸に平行な走査線を上から下へと動かしていき,走査線と交わる線分のみを計算対象とすることで,交差検出の計算量を減らすというものでした(図1)。

図1 平面走査法

図1 平面走査法

実は,これだけでは考え方としてまだ不足なのです。図2を見てください。図2では図1と違い,すべての線分が同じくらいのy座標範囲にまとまって存在しています。こうした場合,走査線が多数の線分と交わる時間が大半を占めるため,計算量をほとんど削減できないことになってしまいます。

図2 走査線と多数の線分の交差

図2 走査線と多数の線分の交差

この状況を改善するには,走査線で垂直方向の計算範囲を限定することに加えて,水平方向にも計算の局所性を持たせる必要があります。具体的には,走査線と線分の交点のx座標を基準にして,水平方向に隣接した線分同士の交差のみをチェックするのです。この様子を図3に示します。

図3 走査線とx座標を両方考慮した交差検出

図3 走査線とx座標を両方考慮した交差検出

平面走査法のデータ構造

以上が,平面走査法による線分交差検出の概要です。このアルゴリズムを実装していくわけですが,まず初めに,アルゴリズムで用いるデータ構造を3つ導入します。3つのデータ構造とは,イベント,イベントキュー,そしてステータスです。

なお,今回からは図4のように,y座標が上から下に向かって増加する座標系を採用します。

図4 座標系

図4 座標系

イベント

走査線は上から下まで動かすと先に述べました。しかし,実際のアルゴリズムでは連続的に動かすわけではなく,特定のイベント点を単位として,離散的に位置を変化させることになります。

イベント点になるのは,アルゴリズムの入力となるすべての線分の端点,そして,計算途中で検出された線分同士の交点です。計算の開始時点では,線分の端点に対応するイベントのみが存在しますが,走査線が移動し,新たな交点が見つかるたびに,交点に対応するイベントが生成されていきます。

イベントオブジェクトは,そのイベント点の座標と,点の種類(線分の始点,線分の終点,線分同士の交点のいずれか)を保持します。さらに,点に関連する線分(始点または終点イベントの場合はその線分,交点イベントの場合は交差する2線分)も合わせて保持します。

イベントキュー

イベントキューは,イベントの順序付き集合です。ここでの順序は,イベントのy座標の大小関係にもとづいて定義され,イベントキューの先頭位置にあるイベントはキューの中で最小のy座標を持ちます。走査線を現在の位置から次の位置へと移動する処理は,イベントキューから先頭のイベントを取り出す作業に相当します。

ステータス

ステータスは,現在の走査線と交差するすべての線分の順序付き集合です。ここでの順序は,走査線と各線分の交点のx座標の大小関係にもとづいて定義されます。この順序関係は,走査線の移動にともなって動的に変化します。例えば,図5で走査線が(A)の位置にあるとき,ステータスは(s1, s2, s3, s4)の順序を保持していますが,走査線が(B)まで下がると,順序は(s1, s3, s2, s4)に変化します。

図5 ステータス

図5 ステータス

著者プロフィール

浜本階生(はまもとかいせい)

1981年生まれ。栃木県出身。東京工業大学情報工学科卒業。技術やアイデアの組み合わせから面白いソフトウェアを生み出したいと日々考えている。現在,ブログの解析および視覚化の試みとして「TopHatenar」「Blogopolis」を開発,運用中。

URLhttp://d.hatena.ne.jp/kaiseh/

コメント

コメントの記入

G-CLOUD

ピックアップ

サイバーエージェントを支える技術者たち

「アメーバブログ」などを展開するAmebaを運営するサイバーエージェントの技術者に,多くの魅力的なサービスを支える秘密を伺いました。

大規模ソーシャルサービス mixiのインフラ技術

日本最大のSNS「mixi」を支えるべく活躍するエンジニアが,日々の運用にまつわるさまざまなできごとを紹介します。

Silverlight業務アプリケーションの画面遷移と画面レイアウト

Silverlightで業務アプリケーションを開発する際の画面遷移と画面レイアウト設計のポイントについて解説します。

エンジニアパワーアップ講座 ~システム基盤を活用するための基礎知識~

イマドキのエンジニアに要求されるさまざまな知識や能力。これらを効率よくキャッチアップしていくヒントをいろいろな視点から取り上げます。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた情報や魅力を多角的に紹介します。

その他の連載

Titanium Mobileで作る! iPhone/Androidアプリ

Objective-CやJAVAでの開発どどう異なるのか,どのくらい速く,そして便利に開発できるのか,実践的なアプリ作成を通して解説します。

Perl Hackers Hub

本連載は,第一線のPerlハッカーが回替わりで,Perlの旬な技術について解説していきます。

小型/堅牢/メンテナンスフリー OpenBlockS 600の限界に挑戦

手のひらに乗るLinuxサーバ「OpenBlockS」のさまざまな活用法を紹介しながら,その強力なポテンシャルと魅力を探ります。

達人が語る,インフラエンジニアの心得

日ごろはコストセンターと認識されているインフラエンジニア。しかし一度トラブルが起こると,速やかかつ柔軟な対応が求められます。そんなインフラエンジニアに日常を,経験豊富な著者が実体験を元に紹介します。

Androidケータイの歩き方

今回から装いも新たに「Androidケータイの歩き方」が始まります。Android元年と予想される2011年に向けて準備していきましょう。

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

LLの惑星群を楽しもう!~gihyo.jp×LL Planets presents

本連載は,8月20日開催する「LL Planets」とgihyo.jpのコラボ企画です。開催に向けて,見どころをお伝えしていきます。

"SwapSkills" Information & Report

SwapSkillsは,都内でWebプロフェッショナル向けに講座の開催をしているWebの勉強会。ここでは,本勉強会の告知情報とレポートをお届けします。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT
  • CLOUD COMPUTING STAGE

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス

最近のコメント