第四章 系統設計
4.2 Main Application 之應用需求層級元件設計
4.2.2 應用需求:果蠅腦之老年痴呆情形分析-AlzheimerFly
對此應用需求而設計的 class 命名為 AlzheimerFlyApplication,並繼承於 MainApplication。下圖為 AlzheimerFlyApplication 的 class diagram:
Main Application getActiveVolume()
getVolumeObjectList()
setActiveVolume(VolumeNode* pVolumeNode) removeActiveVolume()
AlzheimerFlyApplication
MatchFilterThread* requestMatchFilterThread() LoadVolumeThread* requestLoadVolumeThread() FindContourThread* requestFindContourThread()
is a
MatchFilterThread LoadVolumeThread FindContourThread SubThread
圖 4.9 AlzheimerFlyApplication Class Diagram
AlzheimerFlyApplication 繼 承 了 Main Application , 並 且 多 了 三 個
分別為 Matched Filter,Volume Data 之讀取,與作用中 Volume Data 的 Vacuoles 的尋找。一個 vacuole 如[1],是一個類似球形的空洞結構,因此可 能存在數張 slice 當中。而一張 slice 可能存在某一個 vacuole 的切面,稱為 contour 構成,在 FindContour 程序當中即可完成各個 contour 之連結以建立 各個 vacuole。
程序執行的機制其實都是相同的,差別在於傳入的參數依據功能有所不 同,程序完成後的動作也會有所不同。例如 LoadVolume 會在 MainApplication 中加入一組 VolumeNode,而 MatchedFilter 則會在作用中的 VolumeNode 的 子節點加入完成後的 Volume Data。下圖為三個 SubThread 所要傳入的參數
LoadVolum eParam s string fileNam e
FindContourParam s float alpha
MatchedFilterParam s float m inRadius float m axRadius
圖 4.10 AlzheimerFlyApplication 各功能的輸入參數
AlzVolumeNode bool containContourVolumes()
list<ContourVolume*>& getContourVolumeReferences() ContourVolume* getActiveContourVolume()
void setActiveContourVolume(ContourVolume* pContourVolume) VolumeNode
is a
ContourVolume
圖 4.11 VolumeNode Specialized for AlzheimerFlyApplication
在 AlzheimerFlyApplication 當 中 , 使 用 的 VolumeNode 除 了 具 備 MainApplication 當中所述的性質以外,由於 VolumeData 在此應用需求當 中,除了影像資料本身以外,仍需要存放 Vacuoles 的資訊。因此我們除了 特別設計了 AlzVolumeNode 並將其繼承於 VolumeNode 以外,也在每一個
AlzVolumeNode 存放一組 Vacuoles 的資訊。一組 VolumeData 可能擁有許多 張切面(slices),每張切面如[1]所述,均可能存有數個空洞的位置,而一張 slice 當中,一個空洞以一個封閉多邊形(closed polygon)描述之,而一個封閉 的多邊形,又是由數個頂點所構成。這些頂點擁有 x 與 y 的座標,因此從頂 點 開 始 , 多 個 頂 點 (contour vertex) 構 成 一 個 vacuole 切 面 輪 廓 區 域 ( 即 contour),多個 vacuole(同層切面)構成一個 slice 上面的一組 vacuole 資訊(存 成 contour list),多張 slice 上面的 contour list 形成一組屬於該 Volume Data 的整組 vacuole 資訊(我們稱之 contour volume),如下圖所述的合成關係 (composition)。
ContourList
enclosingTest(float x, float y) returns int (i.e. index)
ContourVolume float volume()
ContourList& getContourList(int i)
void refreshAlzheimerCells()
bool testContourActive(Contour& contour) bool testContourDeselected(Contour& contour) void locateActiveComponent
enclosingTest(float x, float y) returns bool
圖 4.12 Composition Relationship of Vacuole Data Structure
以上介紹 vacuole 的資料結構。由於要接收來自使用者的滑鼠點選,以 判斷使用者是不是點選於某個 contour 之內,因此對一個 contour(即 vacuole) 而言,我們必須提供一個介面,輸入 x 與 y 座標,詢問該 contour 此點是否 位在其中。此介面即為 enclosingTest 方法。使用者的滑鼠座標通常會點選於 一 張 切 面 (slice) 上 的 某 個 輪 廓 區 域 , 而 一 張 slice 則 是 對 應 至 一 組 ContourList,因此一個 ContourList 也提供了 enclosingTest,也是傳入點選的
座標,並搜尋所有的 contours,若有在其中一個輪廓區域內則傳回該 contour 的索引值(index),否則傳回-1,在 contour volume 當中則將該 contour 設定為”
已標示”的狀態,以供 UI 在繪製這些 contour 的時候,能夠將已標示的 contour 以別的顏色畫出。
另外 ContourVolume 提供 volume 屬性,係計算該 volume 當中所有 vacuoles 的體積總和。計算的方法是將每一個 vacuole 的每一個 contour 的面 積(area()方法)相加(須扣掉被使用者排除的部分)。使用者可在點選其中一 個 vacuole(某個 contour)以後,決定是否排除該 vacuole 體積的計算。排除的 動作經由 UI 程式操作 ContourVolume 當中的 toogleActiveComponentState 方 法即可切換目前是否列入排除的 vacuole。
以上是 AlzheimerFlyApplication 的設計部份,下一小節我們介紹半自動 果蠅腦神經追蹤系統在 MainApplication 當中的設計。