• 沒有找到結果。

應用需求:半自動果蠅腦神經追蹤系統-NeuTrApplication

第四章 系統設計

4.2 Main Application 之應用需求層級元件設計

4.2.3 應用需求:半自動果蠅腦神經追蹤系統-NeuTrApplication

對此應用需求而設計的 class 命名為 NeuTrApplication,並繼承於 MainApplication。下圖為 NeuTrApplication 的 class diagram:

Main Application 圖 4.13 NeuTrApplication Class Diagram

NeuTrApplication 繼承了 Main Application,並且多了二個 methods,除 了 LoadVolumeThread 與 4.2.2 所述相同以外,GVF3DThread 是在本應用需 求當中最為主要的處理程序,這是計算一組 VolumeData 的 GVF 所要用的。

NeuTrVolumeNode bool containGVF3DData()

void getGVF3DData(float***& GVF_U, float***& GVF_V, float***& GVF_W ) string getVolumeDesc()

NeuronList& getNeuronList()

void setGVF3DData(float*** GVF_U, GVF_V, GVF_W ) void snakeActiveNeuron(SnakeParams& params)

VolumeNode

is a

NeuronList

圖 4.14 VolumeNode Specialized for NeuTrApplication

在 AlzheimerFlyApplication 當中,使用的 VolumeNode 除了繼承於 VolumeNode 以外,尚需要存放 GVF 的計算結果,與使用者所編輯的 Neuron 資訊。如上圖,一組 VolumeData 將會含有一個 NeuronList 以存放一組 Neuron。一組 Neuron 由多個(0..*)Neuron 所構成,在本系統當中經由使用者 編輯而成。一個 Neuron 以多個點(3D)形成的 polyline 表示,每個點擁有 x、

y 與 z 座標,分別表示該組 VolumeData 的 slice z, row y, 的像素 x。

NeuronList bool noNeuronActive() Neuron& getActiveNeuron()

bool testNeuronActive(Neuron& neuron);

void locateNeuron(float x, float y);

updateActiveNeuron(Neuron& neuron); float distance(float x, float y)

圖 4.15 Neuron Data Structure

以上介紹 Neuron 的資料結構。由於要接收來自使用者的滑鼠點選,以 判斷使用者點選的位置是否靠近該 Neuron(約 5-7 pixel 以內),因此對一個 neuron 而言,提供 distance 方法(method),輸入 x 與 y 座標,詢問該 neuron 此點是否位在其中。由於 neuron 各點都是三維的,但以正交投影(Orthogonal Projection)至螢幕上以後,是平面的,因此只取 x 與 y 座標即可。另外在 NeuronList 當中,我們亦提供 locateNeuron 的方法,同樣傳入滑鼠點選的 x 與 y 座標,此時 NeuronList 則從 neuron 當中找出與點選的座標最靠近(且 足夠靠近約 5-7 pixel 以內)的 neuron 以提供 User Interface 判斷是否為作用 中的 neuron,並以不同顏色標示。對於作用中的 Neuron,亦可使用 NeuronList 提供的 snakeActiveNeuron,以 GVF 資訊輔助,對其以 snake 演算法變形,

使得能夠更貼近原 Volume Data 之特徵之位置。

另外透過 NeuronList,我們亦可從 getActiveNeuron 取得目前的 Neuron 在 UI 當 中 編 輯 ( 例 如 在 Neuron 的 末 端 加 入 一 些 節 點 ), 並 以 updateActiveNeuron 更新作用中的 Neuron 資訊,或是以 removeActiveNeuron 移除作用中的 Neuron。至於 addNeuron 則是傳入一個 Neuron 以在 NeuronList

加入一個 Neuron。其中,對於 Neuron 的加入與修改等動作,均由使用者以 滑鼠點選編輯而成,因此我們為 Neuron 以 Builder Pattern[9][10]設計了一種 建構程序:

NeuronBuilder – 一種 Builder Pattern 的實作

NeuronBuilder

moveFloatingVertex(float x, float y, float z) addNeuronVertex(float x, float y, float z) addFloatingVertex()

stepBack()

Neuron creates

NeuronAdder NeuronModifier

圖 4.16 NeuronBuilder Class Diagram

NeuronBuilder 主要提供 Neuron 新增與修改的功能,又分為用來新 增一個 Neuron 的 NeuronAdder 與修改作用中的(即被標示出的)Neuron 的 NeuronModifier。NeuronBuilder 的執行狀態表示如下:

Building Neuron beginBuildNeuron

addFloatingVertex/stepBack

complete/cancel buildingNeuron

moveFloatingVertex

圖 4.17 Building a Neuron

NeuronBuilder 均 按 照 此 方 式 實 現 Neuron 的 建 立 與 修 改 。 執 行

beginBuildNeuron 方法並傳入目前作用中 Volume Node 的 NeuronList 以開始 建立或修改 neuron,這時候若使用 NeuronAdder,此 builder 會存放一個不包 含任何頂點的 Neuron,稱為 tempNeuron;若為 NeuronModifier,其 tempNeuron 則為作用中的 NeuronList 的目前所標示的那個 Neuron 的 reference。

除了 tempNeuron,也存在一個用來存放即將加入的 floatingVertex。在 UI 中,若使用者將滑鼠移動到影像中的某個座標,且這時候正在編輯 Neuron,則會將 floatingVertex 的 xy 與 z 分別設定為使用者的滑鼠座標(x 與 y)以及目前瀏覽的切面索引(z)。若移動到某個頂點接之後使用者確認將此點 加入,則將 floatingVertex 加入 tempNeuron 當中。使用者反覆的重複此動作,

直 至 完 成 編 輯 之 後 NeuronBuilder 將 tempNeuron 加 入 或 更 新 於 beginBuildNeuron 時所傳入的 neuronList。

以 上 介 紹 MainApplication 的 設 計 , 根 據 兩 種 應 用 需 求 分 為 AlzheimerFlyApplication 與 NeuTrApplication。其中 AlzheimerFlyApplication 提供 MatchedFilter 的計算、Vacuoles 的搜尋,並存放找出的 Vacuoles 以供使用者點選 是否列入計算,與計算該 VolumeData 當中的 Vacuoles 總體積。而 NeuTrApplication 則 提 供 了 便 利 UI 程 式 將 使 用 者 編 輯 的 Neuron 加 入 / 更 新 至 其 中 的 NeuronBuilder,與 GVF 的計算程序以輔助 Neuron 的 Snake 變形演算法。

在下一章中,我們將介紹使用者介面的系統設計,並提供一些使用範例的展 示。