在 xDIVA 中,VM 嚴格上來說並不直接拿來與資料作對映,而是經過封裝 後變成一個 mapping node。mapping node 的概念其實就像是一個箱子,然後有一 組標準的介面(IN ports 和 OUT ports)可以和外界溝通,所以它不僅僅可以封裝
VM 進去,也可以將一些不屬於標準的 VM、卻是視覺化中常用到的功能給封裝 進去,例如:數學運算。整個 xDIVA 其實就是由這些 mapping node 所組合而成 的世界,有了這些 mapping node,視覺化就變的有如模組化一般,不同的模組各 自負責一個特定的功能,由使用者依需求去挑選適合的模組進行合成。如果今天 使用者有了新的功能需求,我們也可以很快速的增加一個實做此功能的 mapping
node,而不需要更動到原來的架構。
xDIVA 目前所用到的 mapping node 可以分為 7 種類型,以下分別針對各類
型的 mapping node 做一個簡介:
UBVM:負責視覺化功能的 mapping node,相當於傳統視覺化中所使用的
VM,是視覺化中最基本一定要使用到的,也是本篇論文主要的實做成果,
在第四章中會有更詳盡的說明。
UBRVM:指標或是參考(reference)對於程式設計來說,是經常使用的重要資 料結構了。而指標的視覺化可以幫助程式者更瞭解兩物件間的二元關係。在
xDIVA 中,想要視覺化兩物件的二元關係並不僅限於一種方式。當兩視覺
化物件是屬於同一個複合的資料結構(例如:object、struct 或是 array)時,我 們可以使用 UBVM 中的 line3D_UBVM 去視覺化。使用者只要在 Mapping
Dialog 中將兩視覺化物件的位置與 line3D_UBVM 的起始點和終點的座標做 對映,就可輕易完成視覺化。如果兩視覺化物件是屬於不同的資料結構,則 適用於這類的 mapping node。UBRVM 可以說是專門為視覺化二元關係所設 計的特殊版本的 VM,特別的地方在於 UBRVM 所視覺化的指標物件在展開 前,指向的 VM 是未知的,而這項困難挑戰的成功關鍵,主要是透過 mapping
engine 巧妙的操控由 proxy pattern [23]所設計的 Proxy VM 所完成。
Math mapping node:顧名思義就是負責數學運算功能的 mapping node。一個
Math mapping node 可以接受任意數量的 IN port,當變數連結到一個 IN port 後,會自動再新增一個 IN port,之後由使用者輸入所要運算的數學式,這
圖 20 Math mapping node 以及輸入運算式的視窗
Collectors:負責將任意數量的視覺化物件給收集起來的 mapping node。在程 式設計中,函數(function)所傳入的變數數量都是固定的,沒辦法動態的去改 變,除非利用像 C++中的 STL 物件 vector 將變數給先封裝起來,再傳遞給 函數使用。Collector 型態的 mapping node 就是為了解決此問題而設計的,
因為使用者每次視覺化所需用到的視覺化物件數量可能都不同,所以我們會 利用 vm_collector 這個 mapping node 將視覺化物件給收集起來,然後透過它 特有的 OUT port”vms”傳給像 ubvm_container 這樣具備容器功能的 mapping
node,最後再依序去視覺化出來。Collector 物件之所以分成收集和容器兩類 的原因主要是為了可以對映不同的 layout,例如目前所提供的 ubvm_2darray 就可以將 mapping nodes 按照使用者所設定的行列數目排成二維陣列。
String_composer mapping node:用來調整 VM 被點選時所顯示的除錯資訊的
mapping node。過去視覺化軟體在提供除錯資訊時,都是由系統自動幫使用 者決定輸出哪些資訊,但是這些並不一定是使用者最需要的。在 xDIVA 中,
我們也給予使用者調整視覺化所顯示的除錯資訊的權力。String_composer mapping node 使用上類似 Math mapping node,也是先將變數連結到一組 IN port,然後由使用者透過一個決定輸出格式的視窗,去決定他想看到的資訊 的格式。圖 21 是一個 String_composer mapping node 以及輸出格式的視窗。
舉例來說:一個彩色的立方體,我們在除錯時,可能會想知道它所對映的 RGB 值是否正確,所以我們會將 RGB 值的變數連結到 String_composer mapping node,再將格式設定為(R $0,G $1,B $2),最後將 String_composer mapping node 的 OUT port 連結到 VM 的”_vm_clickmsg”這個 IN port。當這 個 VM 被點選時視覺化結果就會顯示像(R 100,G 50,B 35)的訊息。
圖 21 String_composer mapping node 以及輸出格式的視窗
Clock mapping node:以動畫方式視覺化時所使用的 mapping node。這個
mapping node 是為了發揮 3D 引擎動畫能力所設計的,圖 22 是一個 Clock mapping node,它一共有四個 IN port,分別是 low、high、increment、
time_interval。舉例來說,如果我們想將立方體的速度變數 speed 用立方體旋
轉的動畫方式呈現的話,我們可以將初始值設定給 low(例如設定成 0),然 後設定一個最大值給 high(例如設定成 360),然後將 1/speed 設定給
time_interval,並設定每個時間間隔所要增加的量給 increment(例如設定成 10),最後將 OUT port 輸出的結果連結到立方體的旋轉參數。這樣設定的用 意是告訴系統,每隔 time_interval 的時間,Clock mapping node 中的計數變 數(初始值為 low)會增加 increment 的量,並將累計結果輸出至 OUT port,直 到到達最大值 high 之後,計算變數會恢復成初始值 low 重新開始累計。系 統則定時根據 OUT port 的結果去更新立方體的最新狀態,於是一個會依照 速度變數 speed 旋轉的立方體就誕生了。
圖 22 Clock mapping node
VMclone mapping node:這個 mapping node 只有在 Composer Dialog 中使用,
是專門為了組合 VM 成為新的 VM 所特別設計的。關於 Composer Dialog 與 這個 mapping node 的使用方式,在第四章中會有例子做更詳盡的說明。