第4章 多重注記の間引き機能の実現
4.2 注記の間引きを実現するアルゴリズム(2)
前述の問題点の解決をふまえた,より高度な間引きのためには,処理の対象である同一注 記文字列すべてを見渡しながら処理を行う必要がある.しかし,注記の描画要求順序は,そ の注記がGBD木から読み出された順であり,必ずしも同一注記の描画要求が連続している わけではないため,前述の方式ではどうにもできない.
そこで,改良型のアルゴリズムでは注記の描画要求がきた際にその場で処理をするのでは なく,処理の対象となる注記文字列すべてを一旦リストに保持しておき,それら全体に対し て何らかの処理を施した後に描画するようにするようにするべきであると考えた.
以下,改良型アルゴリズムについて説明する.
描画要求された注記を 全てリストに蓄える
リスト全体を同じ注記名によって ソート
同一注記をx座標によってソート
表示する注記を選択
図 4-4 改良型注記間引きの処理概要
1.まず,描画要求のあった注記文字列をすべてリストに蓄える.この際リストには,描 画要求のあった注記の情報をまとめているデータレコードを保存する.そのデータレコード は以下の通りである.
表 4-1 注記の一時保持レコード フィールド 説明
x 注記のx座標
y 注記のy座標
str 注記文字列
StringObj TStimsStringObject型
ここで,TStimsStringObject型は注記の文字列情報以外のさまざまな情報を格納するた めのレコードであり,次の通りである.
表 4-2 TStimsStringObject型 フィールド 説明
Angle 文字列の角度
FontSize フォントサイズ
FontColor フォントカラー
LineInfoNumber 線状注記文字配置情報総数
LineAngle 線状注記の各文字角度(配列)
LinePoint 線状注記文字配置原点座標(配列)
注記には角度付き注記と線状注記の2つがあり,フィールドのAngleは角度付き注記の みで有効な情報であり,LineInfoNumber, LineAngle, LinePointは線状注記のみで有効と
なる情報である.なお,線状注記とは,文字列の1文字1文字が異なる角度をもっている ような注記である.
また,角度については,x軸を基準として反時計回りの方向が正となるような向きである.
2.すべての注記データがリストに格納された後で,リストを注記文字列によってソート する.これによって,リスト内では同一注記が連続している状態になる.
3.続いて,同一注記内でx座標の昇順にソートする.
4.最後に,表示する注記を選択する.
本実装では,画面に表示する注記の個数を制御できるようになっており,画面に表示する 個数に応じて最後にリスト内から注記を選ぶことになる.
選択法は,同一注記の個数をN,注記表示個数をdispとすると
+ 1
= disp Interval N
で,与えられるIntervalを元にして,同一注記内の
) , , 1 :
( n disp
Interval
n × L
で与えられる位置の注記を画面上に表示する注記として選択する.
このアルゴリズムを用いた同一注記の間引き結果は以下の通りである.
図 4-5 注記間引き前
図 4-6 拡張版注記間引きの結果(表示個数1)
同一注記表示個数を1に設定した場合の結果.表示個数が 1に設定してあるので図4-5の 煩雑な注記群の中で,それぞれの注記のほぼ中心の位置にある注記のみが表示されている.
図 4-7 拡張版注記間引きの結果(表示個数2)
同様に,注記表示個数を 2 に設定した場合の結果.同一注記群をほぼ3等分した位置にあ る注記が表示されている.
図 4-8 拡張版注記間引きの結果(表示個数3)
注記表示個数を3に設定した場合の結果である.