コンピュータを用いる大きな目的の一つにシミュレーション (computer simulation)があります. これは現実には実現できないことや実際に行うと非常にコストがかかることなどを, コンピュータの中に作った仮想世界(virtual world)で実験してみることです. では,このシミュレーションした結果をどのように我々に伝えたら良いのでしょうか. 数字,文字,絵,音声など様々なものが考えられますが, 「百聞は一見にしかず」というように絵を用いることで, 多くの情報をわかりやすく伝えることができます.
このようにデータを直観的に判断しやすいように絵や図で表示することを 「可視化」すると呼びます. 特に様々な計算結果をコンピュータを用いてグラフィカルに表示することを, 科学技術計算の可視化(scientific visualization)と呼び, 様々な分野で用いられています.
結果を数値や文字だけでなく図や絵を用いて表示することの利点として
では,カー・ナビゲーション・システムにおける「データの可視化」について 考えてみましょう.この場合,元となる情報は交差点の位置や信号の待ち時間 などで,伝えたい情報は主にこれからどの経路を選んだら良いか,ということ です.運転しながら次にどちらに行けばよいのかを判断する場合,瞬時にその 情報を伝えなければならないので,方角や位置などを数値するのは適していま せん.逆に,立ち止まってこれから目的地に向かうのにどの経路を選んだら良 いかの計画を立てたり,現在位置を調べる場合には,細かな交差点の情報では なく,地図全体を表示して目標となる建物や途中の道路の混雑情報などをうま く伝えた方が良いでしょう.
このように状況に応じて元になっている情報を様々な角度で分析し,最も効果 的に表現できる方法を検討することが最も重要になります.
練習問題 3-1
与えられた地図情報を元に道路網を描くプログラムを作成してみましょう.
-----------------------
/* map.c --- 地図の表示 */
#include <stdio.h>
#include <math.h>
#include <Xtc.h>
#define CrossingNumber ...
/* 座標変換マクロの定義 */
...
#define gx(x) ...
#define gy(y) ...
/* データ構造の定義 */
...
/* データの宣言 */
Crossing cross[CrossingNumber];
...
/* 道路網の表示 */
void map_show(void)
{
int i, j;
double x0, y0, x, y;
for (i = 0; i < CrossingNumber; i++) {
setcolor(RED);
circle(gx(cross[i].pos.x), gy(cross[i].pos.y), 2);
x0 = cross[i].pos.x;
y0 = cross[i].pos.y;
setcolor(WHITE);
for (j = 0; j < cross[i].points; j++) {
x = cross[cross[i].next[j]].pos.x;
y = cross[cross[i].next[j]].pos.y;
line(gx(x0), gy(y0), gx(x), gy(y));
}
}
}
void main(void)
{
initgraph(); /* グラフィックス環境の初期化 */
map_read("map.dat"); /* 地図情報の読み込み */
map_show(); /* 道路網の表示 */
xtcmainloop( 3 ); /* 終了入力待ち */
closegraph();
}
-----------------------
練習問題 3-2
与えられた道路情報を元に,交差点A,B,C,Dを通る移動体を表示するプログラ ムを作成してみましょう.
-----------------------
/* mobile.c --- 移動体の表示 */
#include <stdio.h>
#include <math.h>
#include <Xtc.h>
#define PathNumber ...
...
/* データの宣言 */
int path[PathNumber+1]; /* 経路: 通過する交差点番号を順番に格納したもの */
/* 隣接する2つの交差点を通る移動体を表示する */
void vehicle_unit_move( int from, int to)
{
...
}
/* pathで与えられた経路を通る移動体を表示する */
void vehicle_move(int path[])
{
int i;
for (i = 0; i < PathNumber; i++) {
vehicle_unit_move(path[i], path[i+1]);
}
}
/* 経路を通過する交差点番号の列として,配列pathに設定する */
void path_set(void)
{
...
}
void main(void)
{
initgraph(); /* グラフィックス環境の初期化 */
map_read("map.dat"); /* 地図情報の読み込み */
path_set(); /* 経路の設定 */
map_show(); /* 道路網の表示 */
vehicle_move(path); /* 経路 path を辿る移動体の表示 */
xtcmainloop( 3 ); /* 終了入力待ち */
closegraph();
}
-----------------------