一種有向無圈圖的層次化顯示方法
【專利摘要】本發(fā)明公開了一種有向無圈圖的層次化顯示方法,包括:(1)創(chuàng)建有向無圈圖的起點(diǎn)和終點(diǎn);(2)讀入數(shù)據(jù)文件,根據(jù)三元組數(shù)據(jù)文件構(gòu)建有向無圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成有向無圈圖的內(nèi)部模型;(3)初始化,將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索;(4)對(duì)有向無圈圖模型進(jìn)行寬度優(yōu)先搜索并顯示;(5)擴(kuò)展處理,對(duì)靜態(tài)關(guān)系圖進(jìn)行擴(kuò)展處理,使之能動(dòng)態(tài)顯示有向無圈圖所有節(jié)點(diǎn),即顯示所有的樹節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn)。本發(fā)明所提出的方法可以用計(jì)算機(jī)系統(tǒng)中常用的樹窗口來顯示復(fù)雜的二維的有向無圈圖,不僅降低了計(jì)算機(jī)系統(tǒng)的開發(fā)者的開發(fā)難度,而且使有向無圈圖使用更加簡(jiǎn)便、快鍵、有效。
【專利說明】—種有向無圈圖的層次化顯示方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計(jì)算機(jī)圖形化【技術(shù)領(lǐng)域】,更具體地,涉及一種有向無圈圖的層次化顯示方法,用于將二維的有向無圈圖用計(jì)算機(jī)系統(tǒng)中常用的樹狀顯示軟件顯示出來。
【背景技術(shù)】
[0002]有向圖是描述各種過程知識(shí)的強(qiáng)有力的手段。有向圖是圖論中一種重要的表現(xiàn)形式,即通過節(jié)點(diǎn)與節(jié)點(diǎn)之間的有向線段表示客觀事物的變化規(guī)律。有向無圈圖是有向圖中一種,是一種不出現(xiàn)回路的有向圖。有向無圈圖表現(xiàn)力非常強(qiáng)大,在很多領(lǐng)域得到廣泛應(yīng)用。例如,在項(xiàng)目管理中,任何一個(gè)項(xiàng)目的執(zhí)行過程都可以用一個(gè)有向無圈圖(稱之為網(wǎng)絡(luò)圖)來表示;而在產(chǎn)品裝配過程中,組成產(chǎn)品的各個(gè)元件的裝配順序也可用一個(gè)有向無圈圖,通常稱之為裝配優(yōu)先關(guān)系圖(Assembly Precedence Graph, APG)來表不。
[0003]在有向圖中,主要存在兩種圖形元件,一類是節(jié)點(diǎn),通常用一個(gè)空心或?qū)嵭牡男A點(diǎn)或圓框表示,另一類是邊,通常用從起始節(jié)點(diǎn)到終止節(jié)點(diǎn)的有向線段或弧來表示,如圖1所示。在圖論中,常常以二維圖形的方式將有向圖用節(jié)點(diǎn)和有向線段或弧繪制出來。因?yàn)槿魏蝺蓚€(gè)節(jié)點(diǎn)之間都可以存在連線,所以必須采用二維或更高維的圖形來表示有向圖,而用一維空間則無法清晰地表示一般有向圖中各節(jié)點(diǎn)之間的關(guān)系,除非該有向圖描述的是線性關(guān)系。采用二維的顯示方法對(duì)于有向圖的表示非常簡(jiǎn)便、清晰、明確,對(duì)于利用有向圖進(jìn)行過程的計(jì)劃和控制非常有價(jià)值,盡管在某些情況下會(huì)出現(xiàn)線段交叉情況。有向無圈圖是有向圖的一種特殊情況,由于不存在回路,其二維的圖形顯示可以通過一定的調(diào)整而變得非常有層次感,甚至可以與時(shí)間維產(chǎn)生一定的關(guān)聯(lián),例如,項(xiàng)目施工網(wǎng)絡(luò)圖可以清晰地表現(xiàn)出每個(gè)施工任務(wù)必須在什么時(shí)間開工,什么時(shí)間結(jié)束等等。
[0004]在計(jì)算機(jī)應(yīng)用系統(tǒng)中,有向圖的顯示也大量采用二維顯示方法,即將有向圖中的節(jié)點(diǎn)和有向線段或弧繪制在計(jì)算機(jī)屏幕上。因?yàn)橛邢蚓€段或弧表示的是節(jié)點(diǎn)之間的關(guān)系,其具體的形狀并不影響關(guān)系的描述,所以在下面的論述中,統(tǒng)一稱為有向線段。在計(jì)算機(jī)中采用二維的顯示方法來進(jìn)行有向圖的顯示可以繼承有向圖二維顯示固有的一些優(yōu)點(diǎn),但在實(shí)現(xiàn)和操作方面也存在一定的缺點(diǎn),主要表現(xiàn)在以下方面:
[0005]I)系統(tǒng)開發(fā)要求高
[0006]雖然有向圖中的圖形元件的種類比較少,只有節(jié)點(diǎn)和有向線段,但是如何擺放合理仍然是一個(gè)比較困難的問題,常常需要開發(fā)一個(gè)非常復(fù)雜的圖形系統(tǒng)。當(dāng)有向圖特別復(fù)雜、圖形元件數(shù)量較多的時(shí)候,需要設(shè)計(jì)高水平的布局算法,才能保證有向圖的清晰性。
[0007]2)自動(dòng)構(gòu)圖難
[0008]因?yàn)殚_發(fā)一個(gè)適合各個(gè)不同領(lǐng)域的布局算法比較困難,所以有向圖圖形系統(tǒng)常常僅提供手工圖形布局設(shè)計(jì)功能,即用戶使用系統(tǒng)提供的圖形元件,根據(jù)需要在圖面上拖放和繪制有向圖。手工繪制雖然可以提供比較完美的效果,但繪制的效率很低,而且不能隨意改變。
[0009]3)整體感差
[0010]當(dāng)有向圖中節(jié)點(diǎn)和有向線段的數(shù)目比較大時(shí),整個(gè)有向圖的幅面將變得很大,而計(jì)算機(jī)顯示屏幕是有限的,這樣就給使用帶來困難。如果觀察整幅圖,則可能看不清圖上的文字信息;如果查看局部圖,則很難形成整體印象。
[0011]4)查找比較麻煩
[0012]同樣,當(dāng)有向圖中的節(jié)點(diǎn)數(shù)很大時(shí),雖然可以放大看清文字,但同時(shí)可見部分很小,尋找不在當(dāng)前視圖范圍內(nèi)的節(jié)點(diǎn)或有向線段時(shí)會(huì)比較困難。而縮小圖面內(nèi)容時(shí),雖然可以快速地移動(dòng)有向圖,但必須通過放大才能確認(rèn)需要查找的內(nèi)容。
[0013]5)圖形維護(hù)困難
[0014]在有向圖的使用過程中,圖本身拓?fù)浣Y(jié)構(gòu)可能發(fā)生改變。一般情況下,增加或刪除一些節(jié)點(diǎn)或有向線段都可能造成圖形布局的變化。雖然在圖論里,圖的布局對(duì)圖所表達(dá)的內(nèi)容和所起的作用不產(chǎn)生本質(zhì)上的影響,但實(shí)際中人們?nèi)匀幌M麍D形布局整齊、美觀、能充分表達(dá)邏輯關(guān)系,所以當(dāng)有向圖發(fā)生變化時(shí)可能需要重新對(duì)其布局,以產(chǎn)生良好的效果。顯然,對(duì)圖形布局的改變實(shí)際上意味著系統(tǒng)必須重新進(jìn)行布局運(yùn)算,其運(yùn)算量將是比較大的。
[0015]有向無圈圖是有向圖的一種特殊情況,在進(jìn)行圖形顯示時(shí)還需要注意以下問題:
[0016]I)整體有向性
[0017]因?yàn)橛邢驘o圈圖不存在回路,盡管可能存在大量的活動(dòng)分支和匯合,箭頭的方向可以有變化,但都可以通過將有向無圈圖進(jìn)行調(diào)整、變換使幾乎所有的箭頭方向保持一致,即所有的活動(dòng)都可理解成從起點(diǎn)朝向終點(diǎn)方向進(jìn)行。例如,項(xiàng)目管理應(yīng)用中的網(wǎng)絡(luò)圖,無論如何復(fù)雜,從整個(gè)項(xiàng)目來說,都是從項(xiàng)目開始,向著項(xiàng)目結(jié)束方向進(jìn)行的,盡管在項(xiàng)目進(jìn)行過程中存在大量串行和并行的活動(dòng),但這些活動(dòng)都是沿著項(xiàng)目整體方向進(jìn)行的。
[0018]2)階段性
[0019]有向無圈圖在整體上是方向一致的,因此從整體上看,有向無圈圖是一維的,從而可以在整體方向上將其劃分成不同的部分。由于有向無圈圖往往用來表示與時(shí)間相關(guān)的活動(dòng)之間的關(guān)系,所以常常稱這些不同的部分為階段。例如,在項(xiàng)目管理中,無論整個(gè)項(xiàng)目中的活動(dòng)如何復(fù)雜,都可將其劃分成不同的階段。
[0020]有向無圈圖的這些特性給圖形的布局帶來了一些特殊性,雖然在布局算法中可以設(shè)計(jì)一些啟發(fā)式規(guī)則予以體現(xiàn),但仍然對(duì)圖形的顯示帶來一些困難。由于有向無圈圖在計(jì)算機(jī)應(yīng)用中得到廣泛的應(yīng)用,提出一種簡(jiǎn)便、快鍵、有效的顯示方法對(duì)于有向無圈圖的應(yīng)用具有較大作用。
【發(fā)明內(nèi)容】
[0021]為了降低現(xiàn)有的有向無圈圖計(jì)算機(jī)顯示方法的開發(fā)難度,方便計(jì)算機(jī)用戶對(duì)有向無圈圖的應(yīng)用和維護(hù),本發(fā)明提出一種新的有向無圈圖的層次化顯示方法。該方法將有向無圈圖按照寬度優(yōu)先的原則進(jìn)行層次化,得到一個(gè)從起點(diǎn)開始的樹狀結(jié)構(gòu),然后將這個(gè)樹狀結(jié)構(gòu)用計(jì)算機(jī)系統(tǒng)中常用的樹窗口進(jìn)行顯示。有向無圈圖上的每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)于樹窗口中的一個(gè)樹節(jié)點(diǎn)或相關(guān)的多個(gè)樹節(jié)點(diǎn)。當(dāng)一個(gè)節(jié)點(diǎn)存在分支節(jié)點(diǎn)時(shí),如果該節(jié)點(diǎn)是需要展開的,則在樹窗口上用該節(jié)點(diǎn)的子節(jié)點(diǎn)表示,否則不將該節(jié)點(diǎn)對(duì)應(yīng)的樹節(jié)點(diǎn)展開。而當(dāng)多個(gè)節(jié)點(diǎn)匯合成一個(gè)節(jié)點(diǎn)時(shí),將在樹窗口上創(chuàng)建多個(gè)樹節(jié)點(diǎn),它們都同時(shí)代表同一個(gè)匯合節(jié)點(diǎn)。只有匯合節(jié)點(diǎn)在樹窗口上才對(duì)應(yīng)多個(gè)樹節(jié)點(diǎn),而其他節(jié)點(diǎn)則與樹節(jié)點(diǎn)一一對(duì)應(yīng)。在任何時(shí)刻同一個(gè)匯合節(jié)點(diǎn)只有一個(gè)對(duì)應(yīng)的樹節(jié)點(diǎn)是展開的。
[0022]為了實(shí)現(xiàn)上述目的,本發(fā)明提供了一種有向無圈圖的層次化顯示方法,所述方法包括如下步驟:
[0023](I)創(chuàng)建有向無圈圖的起點(diǎn)和終點(diǎn);
[0024](2)讀入數(shù)據(jù)文件,根據(jù)三元組數(shù)據(jù)文件構(gòu)建有向無圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成有向無圈圖的內(nèi)部模型;
[0025](3)初始化,將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索;
[0026](4)對(duì)有向無圈圖模型進(jìn)行寬度優(yōu)先搜索并顯示,從起點(diǎn)開始對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行如下子步驟的處理:
[0027](4.1)如果當(dāng)前模型節(jié)點(diǎn)標(biāo)志設(shè)置為未搜索,則進(jìn)入(4.2),否則進(jìn)入(4.3);
[0028](4.2)獲得當(dāng)前模型節(jié)點(diǎn)所有的子模型節(jié)點(diǎn),將其顯示在樹窗口當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹節(jié)點(diǎn)的下面作為子節(jié)點(diǎn);這些樹窗口的子節(jié)點(diǎn)記錄它們所對(duì)應(yīng)的模型節(jié)點(diǎn)的指針,同時(shí)將當(dāng)前模型節(jié)點(diǎn)的標(biāo)志設(shè)置為已擴(kuò)展,其值為對(duì)應(yīng)樹節(jié)點(diǎn)的句柄;
[0029](4.3)取得下一個(gè)當(dāng)前層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.3),直到當(dāng)前層全部模型節(jié)點(diǎn)都處理完畢;
[0030](4.4)取得下一層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.4),直到所有模型節(jié)點(diǎn)都處理完畢。
[0031]在本發(fā)明的一個(gè)實(shí)施例中,所述步驟(2)具體包括:
[0032]數(shù)據(jù)文件讀入后,將這些數(shù)據(jù)與起點(diǎn)和終點(diǎn)連接起來;
[0033]連接起點(diǎn)的方法是,對(duì)所有的節(jié)點(diǎn)進(jìn)行搜索,如果一個(gè)節(jié)點(diǎn)不存在入邊,則認(rèn)為該節(jié)點(diǎn)與起點(diǎn)相連,將該節(jié)點(diǎn)與起點(diǎn)連接起來;
[0034]連接終點(diǎn)的方法是,對(duì)所有的節(jié)點(diǎn)進(jìn)行搜索,如果一個(gè)節(jié)點(diǎn)不存在出邊,則認(rèn)為該節(jié)點(diǎn)與終點(diǎn)相連,將該節(jié)點(diǎn)與終點(diǎn)連接起來;
[0035]所述三元組用來描述有向無圈圖中的任一條有向線段E:E = (Nin,R,Nwt),這里,Nin表示E的起點(diǎn);Ntjut表示E的終點(diǎn);R表示起點(diǎn)Nin和終點(diǎn)Ntjut之間的關(guān)系。
[0036]在本發(fā)明的一個(gè)實(shí)施例中,所述方法還包括:
[0037](5)擴(kuò)展處理,對(duì)靜態(tài)關(guān)系圖進(jìn)行擴(kuò)展處理,使之能動(dòng)態(tài)顯示有向無圈圖所有節(jié)點(diǎn),即顯示所有的樹節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn);所述擴(kuò)展處理包括父節(jié)點(diǎn)顯示操作或移動(dòng)顯示操作,其中:
[0038](5.1)父節(jié)點(diǎn)顯示操作:用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有父節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹節(jié)點(diǎn)位置,然后單擊鼠標(biāo)右鍵彈出一個(gè)對(duì)話框,顯示當(dāng)前樹節(jié)點(diǎn)的所有父節(jié)占.
[0039](5.2)移動(dòng)顯示操作:當(dāng)用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹節(jié)點(diǎn)位置,然后雙擊鼠標(biāo)左鍵,顯示當(dāng)前節(jié)點(diǎn)所有的子節(jié)點(diǎn),同時(shí)將原來在擴(kuò)展節(jié)點(diǎn)位置顯示的所有子節(jié)點(diǎn)全部刪除,即將所有的子節(jié)點(diǎn)從原來顯示的位置都移到當(dāng)前位置來。
[0040]本發(fā)明所帶來的有益效果是,所提出的方法可以用計(jì)算機(jī)系統(tǒng)中常用的樹窗口來顯示復(fù)雜的二維的有向無圈圖,既可以降低計(jì)算機(jī)有向無圈圖的開發(fā)難度,對(duì)復(fù)雜圖形進(jìn)行自動(dòng)化層次顯示、關(guān)聯(lián)關(guān)系動(dòng)態(tài)顯示,增強(qiáng)全局感,同時(shí)也可以提高操作效率和查找效率,更加簡(jiǎn)便地應(yīng)用于計(jì)劃、進(jìn)度控制等相關(guān)行業(yè)。
【專利附圖】
【附圖說明】
[0041]圖1是一個(gè)有向無圈圖;
[0042]圖2是本發(fā)明中寬度優(yōu)先搜索流程圖;
[0043]圖3是對(duì)應(yīng)于圖1的有向無圈圖的層次化顯示圖;
[0044]圖4是顯示當(dāng)前樹節(jié)點(diǎn)的父節(jié)點(diǎn)圖;
[0045]圖5是顯示圖3所示的有向無圈圖對(duì)應(yīng)節(jié)點(diǎn)移動(dòng)顯示操作變化的圖。
【具體實(shí)施方式】
[0046]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個(gè)實(shí)施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。
[0047]在本發(fā)明中,首先假定有向無圈圖是簡(jiǎn)單圖,而且圖本身是正確的,不需要對(duì)錯(cuò)誤的有向無圈圖進(jìn)行驗(yàn)證,即本發(fā)明假定有向無圈圖中是對(duì)具體應(yīng)用的正確反映,每一個(gè)節(jié)點(diǎn)和有向線段都是正確的。換句話說,除了起點(diǎn)和終點(diǎn)外,每一個(gè)節(jié)點(diǎn)都應(yīng)該存在至少一個(gè)入邊和一個(gè)出邊。這樣,對(duì)每一個(gè)節(jié)點(diǎn)都可以找到一條路,即從起點(diǎn)開始,沿著有向線段前進(jìn),最終達(dá)到終點(diǎn)。如果出現(xiàn)孤立點(diǎn),下面所述的本發(fā)明處理方法也是適合的。
[0048]本發(fā)明假定有向無圈圖的輸入采用數(shù)據(jù)文件定義,即用以下三元組來描述有向無圈圖中的任一條有向線段E:
[0049]E = (Nin, R, Nout)
[0050]這里,Nin表示E的起點(diǎn);Ntjut表示E的終點(diǎn);R表示起點(diǎn)Nin和終點(diǎn)Nrat之間的關(guān)系。
[0051]本發(fā)明的目標(biāo)是用計(jì)算機(jī)應(yīng)用系統(tǒng)中常用的樹窗口表示有向無圈圖,由于它們的名稱相同,為了有效地加以區(qū)分,下面的論述中在需要區(qū)分時(shí)稱有向無圈圖中的節(jié)點(diǎn)為模型節(jié)點(diǎn),而稱它在樹窗口中顯示的節(jié)點(diǎn)為樹節(jié)點(diǎn)。如圖2所示,本發(fā)明有向無圈圖的層次化顯示方法的主要步驟如下:
[0052]I)創(chuàng)建有向無圈圖的起點(diǎn)和終點(diǎn)
[0053]盡管在很多情況下,有向無圈圖自然存在一個(gè)起點(diǎn)和終點(diǎn),但是也大量存在多個(gè)起點(diǎn)和終點(diǎn)的情況,所以首先人為的設(shè)定一個(gè)起點(diǎn)和終點(diǎn)。如果有向無圈圖中已經(jīng)存在起點(diǎn)和終點(diǎn),可以在求解完成后予以刪除。
[0054]2)讀入數(shù)據(jù)文件
[0055]根據(jù)三元組數(shù)據(jù)文件構(gòu)建有向無圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成有向無圈圖的內(nèi)部模型。
[0056]數(shù)據(jù)文件讀入后,再將這些數(shù)據(jù)與起點(diǎn)和終點(diǎn)連接起來。連接起點(diǎn)的方法是,對(duì)所有的節(jié)點(diǎn)進(jìn)行搜索,如果一個(gè)節(jié)點(diǎn)不存在入邊,則認(rèn)為該節(jié)點(diǎn)與起點(diǎn)相連,將該節(jié)點(diǎn)與起點(diǎn)連接起來。同樣,連接終點(diǎn)的方法是,對(duì)所有的節(jié)點(diǎn)進(jìn)行搜索,如果一個(gè)節(jié)點(diǎn)不存在出邊,則認(rèn)為該節(jié)點(diǎn)與終點(diǎn)相連,將該節(jié)點(diǎn)與終點(diǎn)連接起來。
[0057]3)初始化
[0058]主要將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索。
[0059]4)對(duì)有向無圈圖模型進(jìn)行寬度優(yōu)先搜索并顯示
[0060]根據(jù)廣義環(huán)圖論,本發(fā)明將寬度優(yōu)先搜索理解成一個(gè)層次搜索過程,即一個(gè)定義起點(diǎn)為第一層,逐步向外擴(kuò)展成第二層、第三層等等的搜索過程。只有當(dāng)上一層的全部節(jié)點(diǎn)搜索完成后才搜索下一層。因?yàn)閷?duì)有向無圈圖進(jìn)行了層次化,所以可以對(duì)相關(guān)的節(jié)點(diǎn)定義父子關(guān)系,即一個(gè)有向線段的起點(diǎn)定義為該線段的終點(diǎn)的父節(jié)點(diǎn),而該線段的終點(diǎn)定義為該線段的起點(diǎn)的子節(jié)點(diǎn)。對(duì)有向無圈圖進(jìn)行寬度優(yōu)先搜索并顯示過程是,從起點(diǎn)開始對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行如下子步驟的處理:
[0061](4.1)如果當(dāng)前模型節(jié)點(diǎn)標(biāo)志設(shè)置為未搜索,則進(jìn)入(4.2),否則進(jìn)入(4.3);
[0062](4.2)獲得當(dāng)前模型節(jié)點(diǎn)所有的子模型節(jié)點(diǎn),將其顯示在樹窗口當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹節(jié)點(diǎn)的下面作為子節(jié)點(diǎn)。這些樹窗口的子節(jié)點(diǎn)記錄它們所對(duì)應(yīng)的模型節(jié)點(diǎn)的指針,同時(shí)將當(dāng)前模型節(jié)點(diǎn)的標(biāo)志設(shè)置為已擴(kuò)展,其值為對(duì)應(yīng)樹節(jié)點(diǎn)的句柄;
[0063](4.3)取得下一個(gè)當(dāng)前層的模型節(jié)點(diǎn),重復(fù)重復(fù)(4.1)-(4.3),直到當(dāng)前層全部模型節(jié)點(diǎn)都處理完畢;
[0064](4.4)取得下一層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.4),直到所有模型節(jié)點(diǎn)都處理完畢。
[0065]5)擴(kuò)展處理
[0066]第(4)步完成后,就可以在樹窗口以層次化的形式顯示有向無圈圖,但這種樹窗口顯示的是有向無圈圖的一種靜態(tài)關(guān)系。如果有向無圈圖中不存在匯合,則可在靜態(tài)關(guān)系圖中查看任何一個(gè)樹節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn),但當(dāng)有向無圈圖存在匯合時(shí),則在靜態(tài)關(guān)系圖中就不一定能查看該樹節(jié)點(diǎn)的全部父節(jié)點(diǎn),也不一定能直接查看一個(gè)樹節(jié)點(diǎn)的子節(jié)點(diǎn),因?yàn)閰R合節(jié)點(diǎn)的子節(jié)點(diǎn)并不在多處顯示,而父節(jié)點(diǎn)則是多處顯示的,但直接相連的只有一個(gè)父節(jié)點(diǎn)。為了能顯示所有的樹節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn),需要對(duì)靜態(tài)關(guān)系圖進(jìn)行擴(kuò)展處理,使之能動(dòng)態(tài)顯示有向無圈圖所有節(jié)點(diǎn)。其方法是:
[0067](5.1)當(dāng)計(jì)算機(jī)用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有父節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹節(jié)點(diǎn)位置,然后單擊鼠標(biāo)右鍵彈出一個(gè)對(duì)話框,顯示當(dāng)前樹節(jié)點(diǎn)的所有父節(jié)點(diǎn)。該擴(kuò)展處理稱為父節(jié)點(diǎn)顯示操作。
[0068](5.2)當(dāng)計(jì)算機(jī)用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹節(jié)點(diǎn)位置,然后雙擊鼠標(biāo)左鍵,顯示當(dāng)前節(jié)點(diǎn)所有的子節(jié)點(diǎn),同時(shí)將原來在擴(kuò)展節(jié)點(diǎn)位置顯示的所有子節(jié)點(diǎn)全部刪除,即將所有的子節(jié)點(diǎn)從原來顯示的位置都移到當(dāng)前位置來。該擴(kuò)展處理稱為移動(dòng)顯示操作。
[0069]通過擴(kuò)展處理,本發(fā)明可以動(dòng)態(tài)地查看和查找任意有向無圈圖中的節(jié)點(diǎn)及其關(guān)系,但是不增加有向無圈圖顯示中的節(jié)點(diǎn)和有向線段數(shù)量,其總數(shù)與靜態(tài)有向無圈圖的數(shù)量一樣,不會(huì)帶來節(jié)點(diǎn)數(shù)量的爆炸。同時(shí),因?yàn)樵谟?jì)算機(jī)系統(tǒng)對(duì)樹窗口中節(jié)點(diǎn)的搜索是比較方便的,因此有利于開發(fā)高效的有向無圈圖搜索、定位算法。
[0070]對(duì)于有向無圈圖的整體性和階段性,也可以通過對(duì)樹窗口中樹的層次認(rèn)識(shí)得到了解。例如,樹的深層次的展開對(duì)應(yīng)的是過程發(fā)展趨勢(shì),而每個(gè)層對(duì)應(yīng)于過程的不同階段,即第一層對(duì)應(yīng)于第一階段,第二層對(duì)應(yīng)于第二階段等等。
[0071]下面以計(jì)算機(jī)實(shí)際開發(fā)過程為例,說明本發(fā)明有向無圈圖的層次化顯示方法的實(shí)現(xiàn)過程。本發(fā)明采用VC++6.0系統(tǒng)進(jìn)行開發(fā),以圖1所示的有向無圈圖作為說明對(duì)象,根據(jù)本發(fā)明所揭示的有向無圈圖的層次化顯示的流程圖和實(shí)現(xiàn)方案說明如下:
[0072]步驟1:創(chuàng)建有向無圈圖的起點(diǎn)和終點(diǎn)
[0073]定義節(jié)點(diǎn)類為CNode,則CNode主要數(shù)據(jù)結(jié)構(gòu)如下:
[0074]CString m_Name ;// 節(jié)點(diǎn)的名稱
[0075]CEdge*m_In ;// 所有的入度鏈
[0076]CEdge*m_0ut ;// 所有的出度鏈
[0077]int m_Flag ;// 處理標(biāo)志
[0078]CNode*m_Next ;// 指向下一個(gè)節(jié)點(diǎn)
[0079]定義有向線段類為CEdge,則CEdge的主要數(shù)據(jù)結(jié)構(gòu)如下:
[0080]CString m_Relat1n ;//具體的先后順序關(guān)系
[0081]CNode*m_Node ;// 被聯(lián)接的節(jié)點(diǎn)
[0082]CEdge*m_Next ;// 下一個(gè)有向線段
[0083]int m_Flag ;// 處理標(biāo)志
[0084]創(chuàng)建起點(diǎn)和終點(diǎn)節(jié)點(diǎn)變量,其成員變量m_Name分別設(shè)為“起點(diǎn)”和“終點(diǎn)”,其他所有的數(shù)據(jù)項(xiàng)均為空,標(biāo)志為O。
[0085]步驟2:讀入數(shù)據(jù)文件
[0086]從數(shù)據(jù)文件中讀入描述有向無圈圖的有向線段數(shù)據(jù),生成相應(yīng)的CNode和CEdge對(duì)象,并將CEdge對(duì)象放入對(duì)應(yīng)的CNode中,形成有向無圈圖的數(shù)據(jù)模型。
[0087]然后將這些數(shù)據(jù)對(duì)象與起點(diǎn)和終點(diǎn)相連。如果一個(gè)CNode對(duì)象的m_In成員為空,則將其連接到起點(diǎn)上,如果一個(gè)CNode對(duì)象的m_0ut成員為空,則將其連接到終點(diǎn)上。
[0088]步驟3:初始化
[0089]搜索全部CNode對(duì)象,并將其成員變量m_Flag設(shè)置為未搜索。
[0090]步驟4:對(duì)有向無圈圖模型進(jìn)行寬度搜索并顯示
[0091]其過程如圖2所示。各步驟說明如下:
[0092]步驟201:開始。
[0093]步驟202:將起點(diǎn)加入到當(dāng)前層中。以下的搜索針對(duì)當(dāng)前層中的節(jié)點(diǎn)。
[0094]步驟203:檢查當(dāng)前層中是否存在沒有進(jìn)行處理的節(jié)點(diǎn)。
[0095]步驟204:如果當(dāng)前層中還存在沒有處理的節(jié)點(diǎn),則取出一個(gè)節(jié)點(diǎn)。
[0096]步驟205:判斷該節(jié)點(diǎn)成員變量m_Flag是否為未搜索狀態(tài)。
[0097]步驟206:如果該節(jié)點(diǎn)成員變量m_Flag是未搜索狀態(tài),表示它的子節(jié)點(diǎn)沒有展開,則在樹窗口中顯示它的子節(jié)點(diǎn),同時(shí)在這些樹窗口的子節(jié)點(diǎn)中記錄對(duì)應(yīng)的節(jié)點(diǎn)指針,最后將當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹節(jié)點(diǎn)句柄記錄在當(dāng)前節(jié)點(diǎn)的成員變量m_FIag中。
[0098]步驟207:將當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)加入到下一層中。
[0099]步驟209:如果當(dāng)前層所有的節(jié)點(diǎn)都已處理,即不存在未處理節(jié)點(diǎn),則檢查是否到達(dá)最后一層。
[0100]步驟208:如果沒有到達(dá)最后一層,則將下一層設(shè)置為當(dāng)前層,轉(zhuǎn)到步驟203,重復(fù)以上過程。
[0101]步驟210:如果達(dá)到最后一層,說明全部節(jié)點(diǎn)都已遍歷,則退出當(dāng)前過程。
[0102]本步驟完成后,得到圖3的結(jié)果,即用樹窗口表示的圖1所示的有向無圈圖。其中樹窗口中圖像標(biāo)志為矩形(“ ■”或“□”)的樹節(jié)點(diǎn)表示該節(jié)點(diǎn)是普通節(jié)點(diǎn),而圖像標(biāo)志為三角形(的樹節(jié)點(diǎn)表示該節(jié)點(diǎn)有子節(jié)點(diǎn),但是在此處沒有展開。
[0103]步驟5:擴(kuò)展處理
[0104]擴(kuò)展處理主要包括兩個(gè)操作:針對(duì)當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)顯示操作和移動(dòng)顯示操作。
[0105]對(duì)于父節(jié)點(diǎn)顯示操作,在對(duì)右鍵的消息響應(yīng)程序里,可以用一個(gè)循環(huán)語句獲得當(dāng)前節(jié)點(diǎn)所有入邊的起點(diǎn),然后將其顯示在一個(gè)對(duì)話框中,如圖4所示。
[0106]對(duì)于移動(dòng)顯示操作,首先構(gòu)造一個(gè)雙擊響應(yīng)程序,在該段程序里,可以根據(jù)步驟206記錄的信息,找到當(dāng)前樹節(jié)點(diǎn)的展開樹節(jié)點(diǎn),如果展開樹節(jié)點(diǎn)就是本身,則退出當(dāng)前程序,否則將展開樹節(jié)點(diǎn)下所有的子節(jié)點(diǎn)移動(dòng)到當(dāng)前樹節(jié)點(diǎn)下面作為子節(jié)點(diǎn)。移動(dòng)過程中復(fù)制所有的信息,同時(shí)將當(dāng)前模型節(jié)點(diǎn)成員變量m_Flag設(shè)置為當(dāng)前樹節(jié)點(diǎn)。例如,在圖3中雙擊圖形標(biāo)志為“▲”的樹節(jié)點(diǎn)“9”,則將該節(jié)點(diǎn)對(duì)應(yīng)的展開節(jié)點(diǎn)的全部子節(jié)點(diǎn)內(nèi)容移動(dòng)到當(dāng)前節(jié)點(diǎn)作為其子節(jié)點(diǎn),如圖5所示,即將圖3中虛圓框內(nèi)的內(nèi)容移動(dòng)圖5中虛圓框內(nèi),同時(shí)對(duì)應(yīng)的樹節(jié)點(diǎn)的圖形標(biāo)志(“.”或“□”和“▲”或“Λ”)也互換。
[0107]本具體實(shí)施步驟適合一般的計(jì)算機(jī)系統(tǒng)關(guān)于有向無圈圖的顯示。對(duì)本領(lǐng)域的普通技術(shù)人員而言,本發(fā)明所涉及的數(shù)據(jù)結(jié)構(gòu)和算法可以在一般的計(jì)算機(jī)系統(tǒng)中實(shí)現(xiàn),舉例而H,可以使用VC++、Java等任何聞級(jí)程序設(shè)計(jì)語目加以實(shí)現(xiàn)。
[0108]本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種有向無圈圖的層次化顯示方法,其特征在于,所述方法包括如下步驟: (1)創(chuàng)建有向無圈圖的起點(diǎn)和終點(diǎn); (2)讀入數(shù)據(jù)文件,根據(jù)三元組數(shù)據(jù)文件構(gòu)建有向無圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成有向無圈圖的內(nèi)部模型; (3)初始化,將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索; (4)對(duì)有向無圈圖模型進(jìn)行寬度優(yōu)先搜索并顯示,從起點(diǎn)開始對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行如下子步驟的處理: (4.1)如果當(dāng)前模型節(jié)點(diǎn)標(biāo)志設(shè)置為未搜索,則進(jìn)入(4.2),否則進(jìn)入(4.3); (4.2)獲得當(dāng)前模型節(jié)點(diǎn)所有的子模型節(jié)點(diǎn),將其顯示在樹窗口當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹節(jié)點(diǎn)的下面作為子節(jié)點(diǎn);這些樹窗口的子節(jié)點(diǎn)記錄它們所對(duì)應(yīng)的模型節(jié)點(diǎn)的指針,同時(shí)將當(dāng)前模型節(jié)點(diǎn)的標(biāo)志設(shè)置為已擴(kuò)展,其值為對(duì)應(yīng)樹節(jié)點(diǎn)的句柄; (4.3)取得下一個(gè)當(dāng)前層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.3),直到當(dāng)前層全部模型節(jié)點(diǎn)都處理完畢; (4.4)取得下一層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.4),直到所有模型節(jié)點(diǎn)都處理完畢。
2.如權(quán)利要求1所述的方法,其特征在于,所述步驟(2)具體包括: 數(shù)據(jù)文件讀入后,將這些數(shù)據(jù)與起點(diǎn)和終點(diǎn)連接起來; 連接起點(diǎn)的方法是,對(duì)所有的節(jié)點(diǎn)進(jìn)行搜索,如果一個(gè)節(jié)點(diǎn)不存在入邊,則認(rèn)為該節(jié)點(diǎn)與起點(diǎn)相連,將該節(jié)點(diǎn)與起點(diǎn)連接起來; 連接終點(diǎn)的方法是,對(duì)所有的節(jié)點(diǎn)進(jìn)行搜索,如果一個(gè)節(jié)點(diǎn)不存在出邊,則認(rèn)為該節(jié)點(diǎn)與終點(diǎn)相連,將該節(jié)點(diǎn)與終點(diǎn)連接起來; 所述三元組用來描述有向無圈圖中的任一條有向線段E:E = (NtoRjtjut),這里,Nin表示E的起點(diǎn)Arat表示E的終點(diǎn);R表示起點(diǎn)Nin和終點(diǎn)Nrat之間的關(guān)系。
3.如權(quán)利要求1或2所述的方法,其特征在于,所述方法還包括: (5)擴(kuò)展處理,對(duì)靜態(tài)關(guān)系圖進(jìn)行擴(kuò)展處理,使之能動(dòng)態(tài)顯示有向無圈圖所有節(jié)點(diǎn),即顯示所有的樹節(jié)點(diǎn)的父節(jié)點(diǎn)和子節(jié)點(diǎn);所述擴(kuò)展處理包括父節(jié)點(diǎn)顯示操作或移動(dòng)顯示操作,其中: (5.1)父節(jié)點(diǎn)顯示操作:用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有父節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹節(jié)點(diǎn)位置,然后單擊鼠標(biāo)右鍵彈出一個(gè)對(duì)話框,顯示當(dāng)前樹節(jié)點(diǎn)的所有父節(jié)點(diǎn); (5.2)移動(dòng)顯示操作:當(dāng)用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹節(jié)點(diǎn)位置,然后雙擊鼠標(biāo)左鍵,顯示當(dāng)前節(jié)點(diǎn)所有的子節(jié)點(diǎn),同時(shí)將原來在擴(kuò)展節(jié)點(diǎn)位置顯示的所有子節(jié)點(diǎn)全部刪除,即將所有的子節(jié)點(diǎn)從原來顯示的位置都移到當(dāng)前位置來。
【文檔編號(hào)】G06F9/44GK104375829SQ201410605695
【公開日】2015年2月25日 申請(qǐng)日期:2014年10月30日 優(yōu)先權(quán)日:2014年10月30日
【發(fā)明者】尹文生, 尹強(qiáng) 申請(qǐng)人:華中科技大學(xué)