flint>flint blog>2018年> 3月>18日>グラフィカルなお仕事

グラフィカルなお仕事

普段はもっぱらウェブアプリケーションの開発ばかりやっているのですが、縁あって年に1~2度の頻度で研究・教育系のグラフィカルなシステムの制作も行っています。

コンピュータが取り扱う「データ」とはつまるところ「数値の羅列」ですが、並べられた大量の数字、たとえば以下のような表を眺めていても、そのデータにどのような性質・特徴があるのかといったことは見えてこないでしょう。

ID X Y Z Time Voltage
107556 253 44 111 4190 -0.217001
107557 254 44 111 4190 -0.199018
107558 255 44 111 4190 -0.000210
107559 0 45 111 4190 0.043779
107560 1 45 111 4190 0.155322
107561 2 45 111 4190 0.154002
107562 3 45 111 4190 0.003454

数十万から数百万レコードにも及ぶ大量のデータをそのまま把握することは不可能なので、適切な可視化を行う必要があります。 しかし、これらのデータは時間的な変化を含めて4~6 (ときにはそれ以上) の次元自由度を持つため、単純なグラフ化はもとより、単純な3次元空間へのプロットでは充分な表現を得ることは望めません。

そのため、データの特徴とその意味を考慮しながら適切な可視化手法を考案・実装する必要が生じてきます。 今回紹介するのは、そうした特殊な可視化を行うためのプログラムですが、詳細についての説明はあまりにも入り組んでいるため割愛。 皆様には風変わりなスクリーンショットを眺めて楽しんでいただければ幸いです。

4次元空間の図示

fig1-1

最初に紹介するのは、とある逐次計算処理の進行を可視化するプログラム。 このプログラムでは、4つの自然数 a, b, c, d によって表される座標点 X (a, b, c, d) が写像

f : N4 N4

を用いて X' (a', b', c', d') = f (X) に写され、これがさらに X'' (a'', b''', c''', d''') = f (X') に写され、これがまたさらに X''' (a''', b''', c''', d''') = f (X'') に......という具合に、次々と新しい座標点に移動していく様子がアニメーションで表現されます。

X, X', X'', ... は4次元空間内の点であるため、そのままでは3次元空間に棲む生物に知覚可能な形式で図示することができません。 ところが、この例では a, b, c, d が取りうる値はそれぞれ 0 から 65535 (=232 - 1) の間に制限されているので、

  • p := 65536a + b
  • q := 65536c + d

と定義すれば X(a, b, c, d) = Y(p, q) となり、2次元空間内 (平面上) の座標点として扱うことができるようになります。 右の図は、4つの点が平面状を弧を描くように飛び跳ねながら移動していく様子を描画したアニメーションの1コマです。

fig1-2

このアニメーションでも「写像による反復変換処理を可視化する」という目的は果たされているのですが、畳の上をノミが跳ね回っているようなこの絵面はいかにも地味。

実はこのプログラムはある種のデモンストレーションに使用されるものなので、「見た目に流麗」であることも要求されていたため、これではそれに応えられていません。 そこでとりあえず、舞台となる二次元の平面を湾曲させて端と端をくっつけ、トーラス状にしてみることに。 するとどうでしょう。 単なる放物線のように見えていた変換の軌道が、荷電粒子が霧箱の中に描く軌跡のようなテイストを帯びてきました。

さらに、この逐次計算の途中には「各点の軌道を256本に分岐させる」という処理が存在しました。 この処理が発動すると、まるでオーロラのような色彩のうねりが画面上に出現します。

fig1-3

この後は、軌道の「着地点」にマーカが出現したり、それらが盛大に爆発四散したりするのですが、ここではそれらを詳細に説明するのは困難なので割愛し、アニメーションの進行のみを示します。

fig1-4 fig1-5 fig1-6 fig1-7

ベクトル場の図示

fig2-1
fig2-2

次にお目にかけるのは、電子回路の周囲に形成される電場の変化をシミュレートするプログラム。 右図上段の画像は、作動中の回路を表しています。 電線の色 (灰色~オレンジ色のグラデーションが巡回) とそれを取り巻くように回転する小さなリングは、そこを流れる電流周波数および向きを示しています。

電流がその周囲の磁場を励起するのは、高校時代に物理を履修された方はご存知の通り。 このプログラムでは、回路を構成する電線を微小な区間に分割し、それぞれの区間を通る電流 (電流要素) に対して「ビオ・サバールの法則」を適用することで、空間の各点の磁気ベクトル (磁場の大きさおよび方向) を決定しています。

微小な長さの電流要素 I dl によって r 離れた位置に作られる微小な磁場 dH

で表される。

そうして計算された磁気ベクトルを重ねて表示したのが右図下段の画像。 電線のループ面を垂直に貫く磁場が形成されているのがお分かり頂けるでしょうか。

このプログラムでは、ユーザはこの先端に導体の小さなループを取り付けたプローブ (探針) を操作して、回路に対する干渉を行うことができます。 ここで注目して欲しいのは、回路のように電源に接続されていないにも関わらず、プローブにも電流が流れ、その周囲の磁場が励起されていること。 これは回路が励起した磁場の中に導体のループを置いたことにより、電磁誘導が起きているため。 プローブを回路に近づけていくと、それらの位置関係に応じた独特な「形」をした磁場が現れます。

fig2-3 fig2-4

計算量を減らす工夫

実を言うと、ここまでの説明にはちょっとしたゴマカシがありました。 このプログラムでは、磁気ベクトルを、対象となる空間をX, Y, Z軸方向にそれぞれ S (= 40) 分割する格子の頂点上に表示しているのですが、その総数は

(S + 1)3 = 68,921

となります。 これに対して、回路上の要素電流の数を N (= 240: 例示された回路における値) だとすると、プログラムがフレームごとに行う上記「ビオ・サバールの法則」式の計算回数は

(S + 1)3 N = 68,921×240 = 16,541,040

となってしまい、一般的なスペックのPC上で行うリアルタイム・シミュレータとしては使い物になりません。 厳密な計算結果が要求される場面ではこれは大問題ですが、幸いにも、このプログラムに求められているのは「おおまかな電磁場の変化を感覚的に捉えることができるようにする」程度のものであるため、ある程度の「チート」をして計算負荷を低減させることが認められていました。 とは言え、完全なデタラメを出力させることはできませんので、「どの部分にウソを入れるか」は思案のしどころです。

先の計算式において、N は入力される回路の形状によって変化する値であるため、おいそれと減らすわけにはいきませんし、何よりこれを幾らか減らしたことろで、最終的な結果 (計算適用回数) には大した影響はありません。 それよりも、3乗という高次のオーダにある S を減らすことを考えた方が良さそうです。 ここでは仮に、空間の分解能を S (=40) から、s、ここでは仮に 10 程度まで減らしたとしましょう。 その場合、磁気ベクトルの計算を行う格子点の間隔は4倍に延びてしまうため、画面に表示する磁気ベクトルの密度を維持しようとすると、その多くが格子の「間隙」に位置してしまうため、正確な値を以ってこれらを表示することはできません。 しかし、表示しようとしている点が含まれるグリッドの8つの頂点の値から、これを次のように補間することで、ある程度の整合性のある値を得ることはできます。 (簡単のため2次元で説明していますが、3次元の場合も考え方は同じ。)


この工夫により、適用計算回数はなんと厳密な計算を行った場合の2%以下まで未満されました。

(s + 1)3 N = 1,331×240 = 319,440

もちろん、先にも述べた通りこれはある種の「ズル (cheat)」なので、これを行う前に「自分が今手掛けているプログラムでそれは許されるのか」という検討は欠かせません。 また、取り扱うデータモデルによっては、他の補間方式を用いる方が良い場合もあります。

ポテンシャル場の図示

Kinect for Xbox One

最後に示すのは、アンテナと Kinect を利用して、空間内の電磁波を測定・表示するプログラム。 前節の電磁誘導シミュレータと似ていますが、次の二つの点で大きく異なります。

一つ目は、空間内の各点に分布する値がベクトルではなくスカラーであること。 ベクトル場のように「向き」「流れ」を持たないスカラー場の「形」を見せるには、それなりの工夫をしなければなりません。 今回利用したのは、格子状に並んだスカラーデータから等値面 (isosurface) - 等しい値を持つ点を繋げて形成される、いわば3次元版の等高線とでもいうべき面 - を形成する、マーチングキューブ法と呼ばれる手法です。

可視化の技術がもたらすもの

コンピュータ (自動計算機) の登場によって我々が得たもののひとつは、その名が示す通りの、人手ではとても行うことの叶わない莫大な量の「計算」をやってのける能力。 現在私たちが住むこの社会はコンピュータが行う集計・分析処理に支えられており、それなしに生活に必要となる各種の供給・インフラを維持することは、いまや一日たりとて不可能だと考えられます。

その一方で、コンピュータはその強大な計算力によって、サーモグラフィが赤外線を、ソナーが音波を「見える」ようにすることによって人間の視覚を拡張してきたように、これまでには見ることのできなかった対象を見ることのできる新しい「眼」を我々にもたらしました。 例えば、マンデルブロ集合マイクロ背景放射がどのような姿形をしているものかを、人類はコンピュータによる支援なしには知ることができなかったでしょう。

そして、これまでに見ることのできなかったものが見えるようになったことで、私たちはさらに、これまで考えることのできなかったことについても考えることができるようになりました。 コンピュータは人類の視力を拡張することで、結果的にその思考能力までもを拡張してきたわけです。

一般に、優れた視力は、どんな物体でも見ることが出来る。 何かを見ることで養われた能力は、他のものに対しても、今までより見やすくする。 本質的に正しいシステムというものは、適用が広い。

こうしたプログラムの作成には、ウェブシステムの構築とはまた違った知識とノウハウが必要になります。 具体的には初歩 (と言っても理工系学士程度) の数学や科学の素養と、OpenGLJava 3D 等のグラフィクスツールの操作でしょうか。 個人的な観測の範囲では、プログラマにの頭数が飽和しつつあるIT業界においても、この種の技術を保持している人材を調達するのはそれほど簡単なことではないようです。

......というわけで、こうした可視化技術に興味をお持ちになられた際には、ぜひ当方へご相談ください。

成田 (「見える化」という言葉は意地でも使わない派)
このエントリーをはてなブックマークに追加

コメント

投稿者
URI
メールアドレス
表題
本文