一種無(wú)向圖或有向有圈圖的層次化顯示方法
【專(zhuān)利摘要】本發(fā)明提供了一種無(wú)向圖或有向有圈圖的層次化顯示方法,包括:(1)創(chuàng)建無(wú)向圖或有向有圈圖的起點(diǎn);(2)讀入數(shù)據(jù)文件,根據(jù)三元組數(shù)據(jù)文件構(gòu)建無(wú)向圖或有向有圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成無(wú)向圖或有向有圈圖的內(nèi)部模型;(3)初始化,將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索;(4)對(duì)無(wú)向圖或有向有圈圖的模型進(jìn)行寬度優(yōu)先搜索并顯示;(5)擴(kuò)展處理,對(duì)靜態(tài)關(guān)系圖進(jìn)行擴(kuò)展處理,使之能動(dòng)態(tài)顯示當(dāng)前節(jié)點(diǎn)的相連節(jié)點(diǎn)或當(dāng)前節(jié)點(diǎn)的展開(kāi)節(jié)點(diǎn)。本發(fā)明方法可以用計(jì)算機(jī)系統(tǒng)中常用的樹(shù)窗口來(lái)顯示復(fù)雜的無(wú)向圖或有向有圈圖,可以降低計(jì)算機(jī)無(wú)向圖或有向有圈圖的開(kāi)發(fā)難度,避免進(jìn)行無(wú)向圖或有向有圈圖的復(fù)雜布局運(yùn)算。
【專(zhuān)利說(shuō)明】—種無(wú)向圖或有向有圈圖的層次化顯示方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計(jì)算機(jī)圖形化【技術(shù)領(lǐng)域】,更具體地,涉及一種無(wú)向圖或有向有圈圖的層次化顯示方法,用于將二維的無(wú)向圖或有向有圈圖用計(jì)算機(jī)系統(tǒng)中常用的樹(shù)狀顯示軟件顯示出來(lái)。
【背景技術(shù)】
[0002]圖論是解決復(fù)雜工程問(wèn)題常用的數(shù)學(xué)理論和工具。無(wú)向圖是圖論中最基本的圖,其特點(diǎn)是:用節(jié)點(diǎn)和節(jié)點(diǎn)之間的連線表示復(fù)雜工程問(wèn)題的拓?fù)潢P(guān)系,通過(guò)對(duì)圖的分析和求解來(lái)完成工程問(wèn)題的求解。
[0003]圖論是求解問(wèn)題的強(qiáng)大工具。當(dāng)許多問(wèn)題采用簡(jiǎn)單的節(jié)點(diǎn)和連線表示時(shí)常常變得比較容易解決,這是因?yàn)橛眠@些簡(jiǎn)單的節(jié)點(diǎn)和連線既可以簡(jiǎn)單地表示問(wèn)題,同時(shí)也能反映問(wèn)題的本質(zhì)。事實(shí)上,圖論應(yīng)用極其廣泛,大多數(shù)的計(jì)算機(jī)應(yīng)用問(wèn)題都用圖來(lái)表示。因此,在使用圖論解決復(fù)雜問(wèn)題時(shí),首先必須繪制出以二維或多維形式(一般采用二維圖形)表示的問(wèn)題,然后通過(guò)對(duì)其進(jìn)行分析、綜合而獲得問(wèn)題的解決。
[0004]在一張圖中,如果任何兩個(gè)節(jié)點(diǎn)之間的連線都是從起點(diǎn)到終點(diǎn)的有向線段或弧,則稱該圖為有向圖,如果任何兩個(gè)節(jié)點(diǎn)的連線都是無(wú)箭頭的線段或弧,則稱該圖為無(wú)向圖。無(wú)向圖可以用有向圖來(lái)表示,即用兩根箭頭相反的有向線段或弧來(lái)連接任何兩個(gè)節(jié)點(diǎn)。顯然,有向圖的表示范圍更大,即無(wú)向圖是有向圖的特例,而且這種有向圖是有圈的,即無(wú)向圖是一種特殊的有向有圈圖。由于在下面的討論中,無(wú)向圖或有向有圈圖的處理方法相同,所以簡(jiǎn)單地用無(wú)向圖表示無(wú)向圖或有向有圈圖。
[0005]在圖論中,無(wú)向圖一般用兩種圖形兀件表不,一種是節(jié)點(diǎn),通常用一個(gè)空心或?qū)嵭牡男A點(diǎn)或圓框表示;另一種是邊,通常用兩個(gè)節(jié)點(diǎn)之間的線段或弧來(lái)表示。
[0006]雖然圖論的能力很強(qiáng),但在使用圖論求解時(shí),并不像其他數(shù)學(xué)工具一樣必須嚴(yán)格遵守書(shū)寫(xiě)規(guī)范,對(duì)圖形的繪制比較隨意,只要能反映出被求解問(wèn)題的內(nèi)在關(guān)系即可。例如,圖1是表示哈密頓提出的20個(gè)城市的環(huán)球航海問(wèn)題的哈密頓圈表示,圖2是一個(gè)非哈密頓圈問(wèn)題的表示,在圖1和圖2中線段的長(zhǎng)度和位置并沒(méi)有嚴(yán)格的限制,甚至可以繪制一個(gè)與之相差很大的圖形,但只要節(jié)點(diǎn)和連線之間的關(guān)系不變,則表達(dá)的問(wèn)題不變。
[0007]當(dāng)我們應(yīng)用計(jì)算機(jī)系統(tǒng)進(jìn)行圖論問(wèn)題求解時(shí),如果也能在計(jì)算機(jī)系統(tǒng)中用二維圖表示無(wú)向圖則效果非常好,但是會(huì)存在以下問(wèn)題:
[0008]I)系統(tǒng)開(kāi)發(fā)要求高
[0009]雖然對(duì)無(wú)向圖的繪制精確度沒(méi)有特殊要求,但繪制無(wú)向圖仍然需要開(kāi)發(fā)一個(gè)二維圖形系統(tǒng)。到目前為止,圖形系統(tǒng)的開(kāi)發(fā)仍然是一個(gè)比較困難的問(wèn)題,需要投入非常多的人力和物力資源。
[0010]2)圖形布局困難
[0011]在很多情況下,無(wú)向圖的布局對(duì)于問(wèn)題的解決起著非常重要的作用。無(wú)向圖表示的是節(jié)點(diǎn)之間的拓?fù)潢P(guān)系,由于同一拓?fù)潢P(guān)系的圖形樣式非常多,即無(wú)向圖的構(gòu)型是很多的,很難自動(dòng)進(jìn)行圖形的布局。另一方面,無(wú)向圖可能出現(xiàn)邊的交叉,例如非平面圖就必然存在交叉線段,如何減少交叉或布置美觀是一個(gè)非常難以解決的問(wèn)題。所以對(duì)于無(wú)向圖繪制系統(tǒng),除了特例外,一般是提供交互工具,讓用戶自己完成無(wú)向圖的繪制。
[0012]3)整體感差
[0013]當(dāng)無(wú)向圖節(jié)點(diǎn)和有向線段的數(shù)目比較大時(shí),整個(gè)無(wú)向圖的幅面將變得很大,而計(jì)算機(jī)顯示屏幕是有限的,這樣就給使用帶來(lái)困難。如果觀察整幅圖,則可能看不清圖上的文字信息;如果查看局部圖,則很難形成整體印象。
[0014]4)查找比較麻煩
[0015]同樣,當(dāng)無(wú)向圖中的節(jié)點(diǎn)數(shù)很大時(shí),雖然可以放大看清文字,但同時(shí)可見(jiàn)部分很小,尋找不在當(dāng)前視圖范圍內(nèi)的節(jié)點(diǎn)或有向線段時(shí)會(huì)比較困難。而縮小圖面內(nèi)容時(shí),雖然可以快速地移動(dòng)無(wú)向圖,但必須通過(guò)放大才能確認(rèn)需要查找的內(nèi)容。
[0016]5)圖形維護(hù)困難
[0017]在無(wú)向圖的使用過(guò)程中,圖本身拓?fù)浣Y(jié)構(gòu)可能發(fā)生改變。一般情況下,增加或刪除一些節(jié)點(diǎn)或有向線段都可能造成圖形布局的變化。顯然,拓?fù)浣Y(jié)構(gòu)的變化會(huì)破壞圖形布局的整齊、美觀,甚至不能有效表達(dá)邏輯關(guān)系,所以當(dāng)無(wú)向圖發(fā)生變化時(shí)需要重新對(duì)其布局,以產(chǎn)生良好的效果。顯然,對(duì)圖形布局的改變實(shí)際上意味著系統(tǒng)必須重新進(jìn)行布局運(yùn)算,其運(yùn)算量將是比較大的。
[0018]為了克服傳統(tǒng)的計(jì)算機(jī)無(wú)向圖圖形顯示方法的缺陷,必須首先對(duì)無(wú)向圖的顯示方法進(jìn)行一些修改,然后采用計(jì)算機(jī)系統(tǒng)中常用的樹(shù)窗口對(duì)其進(jìn)行顯示,以便能更簡(jiǎn)便、快鍵、有效地使用無(wú)向圖。
【發(fā)明內(nèi)容】
[0019]為了降低現(xiàn)有的無(wú)向圖或有向有圈圖的計(jì)算機(jī)顯示方法的開(kāi)發(fā)難度,方便計(jì)算機(jī)用戶對(duì)無(wú)向圖或有向有圈圖的應(yīng)用和維護(hù),本發(fā)明提出一種新的無(wú)向圖或有向有圈圖的層次化顯示方法。該方法首先根據(jù)工程應(yīng)用情況在無(wú)向圖或有向有圈圖中設(shè)置一個(gè)節(jié)點(diǎn)為核心點(diǎn),然后從核心點(diǎn)開(kāi)始,采用寬度優(yōu)先搜索方法對(duì)無(wú)向圖或有向有圈圖進(jìn)行分層,形成一個(gè)樹(shù)狀結(jié)構(gòu),并用常用的計(jì)算機(jī)樹(shù)窗口加以顯示。在樹(shù)窗口顯示的生成過(guò)程中,已經(jīng)在樹(shù)窗口顯示的無(wú)向圖或有向有圈圖的節(jié)點(diǎn)不再顯示??梢酝ㄟ^(guò)對(duì)樹(shù)窗口中樹(shù)節(jié)點(diǎn)的右鍵消息和雙擊消息來(lái)查看當(dāng)前節(jié)點(diǎn)的關(guān)聯(lián)信息。
[0020]為了實(shí)現(xiàn)上述目的,本發(fā)明提供了一種無(wú)向圖或有向有圈圖的層次化顯示方法,所述方法包括如下步驟:
[0021](I)創(chuàng)建無(wú)向圖或有向有圈圖的起點(diǎn);
[0022](2)讀入數(shù)據(jù)文件,根據(jù)三元組數(shù)據(jù)文件構(gòu)建無(wú)向圖或有向有圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成無(wú)向圖或有向有圈圖的內(nèi)部模型;
[0023](3)初始化,將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索;
[0024](4)對(duì)無(wú)向圖或有向有圈圖的模型進(jìn)行寬度優(yōu)先搜索并顯示,從核心點(diǎn)或起點(diǎn)開(kāi)始,一層一層向外搜索并顯示每個(gè)無(wú)向圖或有向有圈圖的節(jié)點(diǎn),包括如下子步驟:
[0025](4.1)如果當(dāng)前模型節(jié)點(diǎn)標(biāo)志設(shè)置為未搜索,則進(jìn)入(4.2),否則進(jìn)入(4.3);
[0026](4.2)獲得當(dāng)前模型節(jié)點(diǎn)所有的子模型節(jié)點(diǎn),將其顯示在樹(shù)窗口當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹(shù)節(jié)點(diǎn)的下面作為子節(jié)點(diǎn);這些樹(shù)窗口的子節(jié)點(diǎn)記錄它們所對(duì)應(yīng)的模型節(jié)點(diǎn)的指針,同時(shí)將當(dāng)前模型節(jié)點(diǎn)的標(biāo)志設(shè)置為已擴(kuò)展,其值為對(duì)應(yīng)樹(shù)節(jié)點(diǎn)的句柄;
[0027](4.3)取得下一個(gè)當(dāng)前層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.3),直到當(dāng)前層全部模型節(jié)點(diǎn)都處理完畢;
[0028](4.4)取得下一層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.4),直到所有模型節(jié)點(diǎn)都處理完畢。
[0029]在本發(fā)明的一個(gè)實(shí)施例中,所述步驟(2)具體包括:
[0030]從數(shù)據(jù)文件中讀入無(wú)向圖或有向有圈圖的核心點(diǎn);
[0031]從數(shù)據(jù)文件中讀入三元組數(shù)據(jù),并依據(jù)這些數(shù)據(jù)構(gòu)建無(wú)向圖或有向有圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成無(wú)向圖或有向有圈圖的內(nèi)部模型;
[0032]數(shù)據(jù)文件讀入后,再將核心點(diǎn)與起點(diǎn)連接起來(lái)。
[0033]在本發(fā)明的一個(gè)實(shí)施例中,所述方法還包括:
[0034](5)擴(kuò)展處理,對(duì)靜態(tài)關(guān)系圖進(jìn)行擴(kuò)展處理,使之能動(dòng)態(tài)顯示當(dāng)前節(jié)點(diǎn)的相連節(jié)點(diǎn)或當(dāng)前節(jié)點(diǎn)的展開(kāi)節(jié)點(diǎn);所述擴(kuò)展處理包括關(guān)聯(lián)節(jié)點(diǎn)顯示操作或展開(kāi)節(jié)點(diǎn)顯示操作,其中:
[0035](5.1)關(guān)聯(lián)節(jié)點(diǎn)顯示操作:當(dāng)用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有相關(guān)聯(lián)的節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹(shù)節(jié)點(diǎn)位置,然后單擊鼠標(biāo)右鍵彈出一個(gè)對(duì)話框,顯示當(dāng)前樹(shù)節(jié)點(diǎn)的所有相關(guān)聯(lián)的節(jié)點(diǎn);
[0036](5.2)展開(kāi)節(jié)點(diǎn)顯示操作:當(dāng)用戶需要觀察某一個(gè)節(jié)點(diǎn)的展開(kāi)的子節(jié)點(diǎn)情況時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹(shù)節(jié)點(diǎn)位置,然后雙擊鼠標(biāo)左鍵,樹(shù)窗口自動(dòng)將當(dāng)前節(jié)點(diǎn)的展開(kāi)節(jié)點(diǎn)作為選擇節(jié)點(diǎn);如果展開(kāi)節(jié)點(diǎn)不在當(dāng)前窗口內(nèi),系統(tǒng)將自動(dòng)移動(dòng)樹(shù)并顯示該展開(kāi)節(jié)點(diǎn)。
[0037]本發(fā)明所帶來(lái)的有益效果是,所提出的方法可以用計(jì)算機(jī)系統(tǒng)中常用的樹(shù)窗口來(lái)顯示復(fù)雜的無(wú)向圖或有向有圈圖,可以降低計(jì)算機(jī)無(wú)向圖或有向有圈圖的開(kāi)發(fā)難度,避免進(jìn)行無(wú)向圖或有向有圈圖的復(fù)雜布局運(yùn)算,既清晰地表示了各節(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系,可以保留無(wú)向圖或有向有圈圖的拓?fù)涮卣?,又不?huì)帶來(lái)圖形節(jié)點(diǎn)數(shù)目的急劇增加。在無(wú)向圖構(gòu)建,特別是大規(guī)模無(wú)向圖或有向有圈圖構(gòu)建時(shí),特別簡(jiǎn)單、不容易出錯(cuò)。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0038]圖1是一個(gè)20個(gè)城市的環(huán)球航海問(wèn)題的哈密頓圈表示無(wú)向圖;
[0039]圖2是一個(gè)非哈密頓圈問(wèn)題的表示無(wú)向圖;
[0040]圖3是本發(fā)明中寬度優(yōu)先搜索流程圖;
[0041]圖4是對(duì)應(yīng)于圖1的無(wú)向圖的層次化顯示圖;
[0042]圖5是對(duì)應(yīng)于圖2的無(wú)向圖的層次化顯示圖;
[0043]圖6是顯示查看圖4 一個(gè)節(jié)點(diǎn)相關(guān)聯(lián)的節(jié)點(diǎn)圖;
[0044]圖7是顯示圖4中當(dāng)前樹(shù)節(jié)點(diǎn)雙擊后的展開(kāi)節(jié)點(diǎn)顯示圖。
【具體實(shí)施方式】
[0045]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個(gè)實(shí)施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。
[0046]在本發(fā)明中,假定無(wú)向圖是簡(jiǎn)單圖,而且圖本身是正確的,不需要對(duì)錯(cuò)誤的無(wú)向圖進(jìn)行驗(yàn)證,即本發(fā)明假定需要繪制的無(wú)向圖是對(duì)具體應(yīng)用的正確反映,每一個(gè)節(jié)點(diǎn)、有向線段和與或關(guān)系都是正確的。
[0047]本發(fā)明假定無(wú)向圖或有向有圈圖的輸入采用數(shù)據(jù)文件定義,即用以下三元組來(lái)描述無(wú)向圖或有向有圈圖中的任一條線段E:
[0048]E = (Nin, R, Nout)
[0049]這里,Nin表示E的一個(gè)端點(diǎn);Ntjut表示E的另一個(gè)端點(diǎn);R表示端點(diǎn)Nin和端點(diǎn)Ntjut之間的關(guān)系。一條線段只描述一次,兩個(gè)端點(diǎn)的次序可以交換。為了避免重復(fù)輸入,可以對(duì)節(jié)點(diǎn)按照數(shù)字進(jìn)行編號(hào),描述線段時(shí)第一個(gè)端點(diǎn)號(hào)總是小于第二個(gè)端點(diǎn)號(hào)。
[0050]在輸入數(shù)據(jù)文件中還需要給出核心點(diǎn)號(hào),即用樹(shù)表示時(shí)的根節(jié)點(diǎn)號(hào)。
[0051 ] 本發(fā)明的目標(biāo)是用計(jì)算機(jī)應(yīng)用系統(tǒng)中常用的樹(shù)窗口表示無(wú)向圖或有向有圈圖,由于它們的名稱相同,為了有效地加以區(qū)分,下面的論述中在需要區(qū)分時(shí)稱無(wú)向圖或有向有圈圖的節(jié)點(diǎn)為模型節(jié)點(diǎn),而稱它在樹(shù)窗口中顯示的節(jié)點(diǎn)為樹(shù)節(jié)點(diǎn)。
[0052]本發(fā)明的主要步驟如下:
[0053]I)創(chuàng)建無(wú)向圖或有向有圈圖的起點(diǎn)
[0054]無(wú)向圖或有向有圈圖本身是沒(méi)有起點(diǎn)的,但在進(jìn)行無(wú)向圖或有向有圈圖層次化顯示時(shí)可以將其看作是一棵樹(shù),即存在一個(gè)起點(diǎn)或根節(jié)點(diǎn)。為了處理方便,本發(fā)明首先創(chuàng)建一個(gè)起點(diǎn),該起點(diǎn)是一個(gè)虛擬的起點(diǎn),認(rèn)為無(wú)向圖或有向有圈圖內(nèi)所有的節(jié)點(diǎn)都是從此出發(fā)的。
[0055]2)讀入數(shù)據(jù)文件
[0056]首先,從數(shù)據(jù)文件中讀入無(wú)向圖或有向有圈圖的核心點(diǎn)。根據(jù)廣義環(huán)圖樹(shù)的方法,本發(fā)明認(rèn)為整個(gè)無(wú)向圖或有向有圈圖有一個(gè)核心,然后從該核心向外依據(jù)寬度優(yōu)先的原則進(jìn)行一層一層的擴(kuò)展。從圖論的角度來(lái)說(shuō),該核心點(diǎn)選擇沒(méi)有限制,但根據(jù)工程實(shí)際需要設(shè)定對(duì)于問(wèn)題的分析與解決比較好。
[0057]然后,從數(shù)據(jù)文件中讀入三元組數(shù)據(jù),并依據(jù)這些數(shù)據(jù)構(gòu)建無(wú)向圖或有向有圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成無(wú)向圖或有向有圈圖的內(nèi)部模型。
[0058]數(shù)據(jù)文件讀入后,再將核心點(diǎn)與起點(diǎn)連接起來(lái)。在本發(fā)明中,因?yàn)闊o(wú)向圖或有向有圈圖實(shí)質(zhì)上是有圈圖,所以即使采用層次化顯示方法進(jìn)行顯示,也不存在終點(diǎn)。
[0059]為了減少模型的數(shù)據(jù)量,盡管無(wú)向圖或有向有圈圖可以理解為有向圖,但在存儲(chǔ)時(shí)仍然只需要存儲(chǔ)一條邊。
[0060]3)初始化
[0061]主要將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索。
[0062]4)對(duì)無(wú)向圖或有向有圈圖模型進(jìn)行寬度優(yōu)先搜索并顯示
[0063]采用寬度優(yōu)先搜索方法進(jìn)行無(wú)向圖或有向有圈圖的層次化顯示操作,即從核心點(diǎn)或起點(diǎn)開(kāi)始,一層一層向外搜索并顯示每個(gè)無(wú)向圖或有向有圈圖的節(jié)點(diǎn)。按照搜索的過(guò)程,可以稱一條邊的兩個(gè)端點(diǎn)之間關(guān)系是父子關(guān)系,即先搜索過(guò)的端點(diǎn)是后搜索到的端點(diǎn)的父節(jié)點(diǎn),后者是前者的子節(jié)點(diǎn)。本發(fā)明規(guī)定,先搜索到的端點(diǎn)展開(kāi)它的子節(jié)點(diǎn),后搜索到的端點(diǎn)不展開(kāi)子節(jié)點(diǎn)。當(dāng)無(wú)向圖或有向有圈圖的寬度搜索過(guò)程結(jié)束后就得到一個(gè)樹(shù)狀表示的無(wú)向圖或有向有圈圖,其中樹(shù)窗口中圖形標(biāo)志為矩形(“■”或“□”)的節(jié)點(diǎn)表示已展開(kāi)子節(jié)點(diǎn),而圖形標(biāo)志為三角形(“▲”或“Λ”)的節(jié)點(diǎn)表示不展開(kāi)子節(jié)點(diǎn)。
[0064]對(duì)無(wú)向圖和有向有圈圖進(jìn)行寬度搜索并顯示過(guò)程是,從起點(diǎn)開(kāi)始對(duì)每個(gè)節(jié)點(diǎn)做如下工作:
[0065](4.1)如果當(dāng)前模型節(jié)點(diǎn)標(biāo)志設(shè)置為未搜索,則進(jìn)入(4.2),否則進(jìn)入(4.3);
[0066](4.2)獲得當(dāng)前模型節(jié)點(diǎn)所有的子模型節(jié)點(diǎn),將其顯示在樹(shù)窗口當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹(shù)節(jié)點(diǎn)的下面作為子節(jié)點(diǎn)。這些樹(shù)窗口的子節(jié)點(diǎn)記錄它們所對(duì)應(yīng)的模型節(jié)點(diǎn)的指針,同時(shí)將當(dāng)前模型節(jié)點(diǎn)的標(biāo)志設(shè)置為已擴(kuò)展,其值為對(duì)應(yīng)樹(shù)節(jié)點(diǎn)的句柄;
[0067](4.3)取得下一個(gè)當(dāng)前層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.3),直到當(dāng)前層全部模型節(jié)點(diǎn)都處理完畢;
[0068](4.4)取得下一層的模型節(jié)點(diǎn),重復(fù)(4.1)-(4.4),直到所有模型節(jié)點(diǎn)都處理完畢。
[0069]5)擴(kuò)展處理
[0070]雖然以樹(shù)窗口層次化形式顯示的無(wú)向圖可以方便地進(jìn)行無(wú)向圖或有向有圈圖的繪制,但對(duì)于無(wú)向圖或有向有圈圖的理解仍然存在一定的困難。例如,當(dāng)無(wú)向圖或有向有圈圖節(jié)點(diǎn)比較多、層次比較深時(shí),查看當(dāng)前節(jié)點(diǎn)的相連節(jié)點(diǎn)就不方便。另外,當(dāng)我們想知道圖形標(biāo)志為三角形(的節(jié)點(diǎn)時(shí)卻因?yàn)楫?dāng)前節(jié)點(diǎn)沒(méi)有展開(kāi)而不方便。
[0071]為了有效地查看當(dāng)前節(jié)點(diǎn)的相關(guān)聯(lián)節(jié)點(diǎn)和了解比較多的組成情況,本發(fā)明設(shè)計(jì)了兩種操作:關(guān)聯(lián)節(jié)點(diǎn)顯示操作和展開(kāi)節(jié)點(diǎn)顯示操作。其方法是:
[0072](5.1)當(dāng)計(jì)算機(jī)用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有相關(guān)聯(lián)的節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹(shù)節(jié)點(diǎn)位置,然后單擊鼠標(biāo)右鍵彈出一個(gè)對(duì)話框,顯示當(dāng)前樹(shù)節(jié)點(diǎn)的所有相關(guān)聯(lián)的節(jié)點(diǎn)。該擴(kuò)展處理稱為關(guān)聯(lián)節(jié)點(diǎn)顯示操作。
[0073](5.2)當(dāng)計(jì)算機(jī)用戶需要觀察某一個(gè)節(jié)點(diǎn)的展開(kāi)的子節(jié)點(diǎn)情況時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹(shù)節(jié)點(diǎn)位置,然后雙擊鼠標(biāo)左鍵,樹(shù)窗口自動(dòng)將當(dāng)前節(jié)點(diǎn)的展開(kāi)節(jié)點(diǎn)作為選擇節(jié)點(diǎn)。如果展開(kāi)節(jié)點(diǎn)不在當(dāng)前窗口內(nèi),系統(tǒng)將自動(dòng)移動(dòng)樹(shù)并顯示該展開(kāi)節(jié)點(diǎn)。該擴(kuò)展處理稱為展開(kāi)節(jié)點(diǎn)顯示操作。展開(kāi)節(jié)點(diǎn)顯示操作和關(guān)聯(lián)節(jié)點(diǎn)顯示操作盡管都是顯示當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn),但在展開(kāi)節(jié)點(diǎn)處可能觀察到更多子節(jié)點(diǎn)及其相關(guān)信息,包括多層子節(jié)點(diǎn)和兄弟節(jié)點(diǎn)信屆、O
[0074]通過(guò)擴(kuò)展處理,本發(fā)明可以動(dòng)態(tài)地查看和查找任意無(wú)向圖或有向有圈圖中的節(jié)點(diǎn)及其關(guān)系,不增加無(wú)向圖或有向有圈圖顯示中的節(jié)點(diǎn)和有向線段數(shù)量。雖然顯示無(wú)向圖或有向有圈圖最好的方法是用二維或多維圖的方式,但本發(fā)明對(duì)于無(wú)向圖或有向有圈圖的顯示也非常有利,因?yàn)閷哟位娘@示也保留了無(wú)向圖或有向有圈圖的一些特征,例如,圖2是一個(gè)對(duì)稱結(jié)構(gòu),而采用本發(fā)明顯示后的結(jié)果也是對(duì)稱結(jié)構(gòu),如圖5所示。
[0075]下面以計(jì)算機(jī)實(shí)際開(kāi)發(fā)過(guò)程為例,說(shuō)明本發(fā)明有向無(wú)向圖或有向有圈圖的層次化顯示方法的實(shí)現(xiàn)過(guò)程。本發(fā)明采用VC++6.0系統(tǒng)進(jìn)行開(kāi)發(fā),以圖1?圖7所示的附圖作為說(shuō)明對(duì)象,根據(jù)本發(fā)明所揭示的無(wú)向圖或有向有圈圖的層次化顯示的流程圖和實(shí)現(xiàn)方案說(shuō)明如下:
[0076]步驟1:創(chuàng)建無(wú)向圖或有向有圈圖的起點(diǎn)
[0077]定義節(jié)點(diǎn)類(lèi)為CNode,則CNode主要數(shù)據(jù)結(jié)構(gòu)如下:
[0078]CString m_Name ;// 節(jié)點(diǎn)的名稱
[0079]CEdge*m_In ;// 所有的入度鏈
[0080]CEdge*m_0ut ; // 所有的出度鏈
[0081]int m_Flag ;// 處理標(biāo)志
[0082]CNode*m_Next ;// 指向下一個(gè)節(jié)點(diǎn)
[0083]定義有向線段類(lèi)為CEdge,則CEdge的主要數(shù)據(jù)結(jié)構(gòu)如下:
[0084]CString m_Relat1n ;//具體的先后順序關(guān)系
[0085]CNode*m_Node ;// 被聯(lián)接的節(jié)點(diǎn)
[0086]CEdge*m_Next ;// 下一個(gè)有向線段
[0087]int m_Flag ;// 處理標(biāo)志
[0088]創(chuàng)建起點(diǎn)節(jié)點(diǎn)變量,其成員變量m_Name設(shè)為“起點(diǎn)”,其他所有的數(shù)據(jù)項(xiàng)均為空,標(biāo)志為O。
[0089]步驟2:讀入數(shù)據(jù)文件
[0090]首先從數(shù)據(jù)文件中讀入核心點(diǎn),創(chuàng)建核心點(diǎn)數(shù)據(jù)對(duì)象,并放在第一層。
[0091]然后從數(shù)據(jù)文件中讀入描述無(wú)向圖或有向有圈圖的有向線段數(shù)據(jù),生成相應(yīng)的CNode和CEdge對(duì)象,并將CEdge對(duì)象放入對(duì)應(yīng)的CNode中,形成無(wú)向圖或有向有圈圖的數(shù)據(jù)模型。由于無(wú)向圖是對(duì)稱的,所以可以僅存儲(chǔ)一半的邊數(shù)據(jù),因此實(shí)際上CNode的成員變量m_In是不需要記錄的。
[0092]最后將核心點(diǎn)數(shù)據(jù)對(duì)象與起點(diǎn)對(duì)象相連,即直接在起點(diǎn)CNode對(duì)象的m_0ut成員中加入核心點(diǎn)對(duì)象即可。
[0093]從純數(shù)學(xué)的角度來(lái)看,雖然在無(wú)向圖或有向有圈圖中沒(méi)有核心點(diǎn),但仍然可以根據(jù)工程意義或者人為的要求設(shè)置一個(gè)核心點(diǎn)。只有設(shè)定了核心點(diǎn)后,才可以進(jìn)行寬度優(yōu)先搜索,才可以對(duì)無(wú)向圖或有向有圈圖進(jìn)行層次化顯示。
[0094]如果將核心點(diǎn)作為寬度優(yōu)先搜索的起始搜索點(diǎn),則不必創(chuàng)建起點(diǎn)。
[0095]步驟3:初始化
[0096]搜索全部CNode對(duì)象,并將其成員變量m_Flag設(shè)置為未搜索。
[0097]步驟4:對(duì)無(wú)向圖或有向有圈圖模型進(jìn)行寬度搜索并顯示
[0098]從起點(diǎn)或無(wú)向圖或有向有圈圖的根節(jié)點(diǎn)開(kāi)始,一層一層向外搜索并顯示每個(gè)無(wú)向圖或有向有圈圖節(jié)點(diǎn)。如果當(dāng)前節(jié)點(diǎn)已經(jīng)展開(kāi),則不再展開(kāi),并將該節(jié)點(diǎn)的圖像標(biāo)志設(shè)為三角形(“▲”或“Λ”);否則將該節(jié)點(diǎn)的圖像標(biāo)志則設(shè)為矩形(“■”或“口”)。
[0099]每個(gè)樹(shù)窗口的節(jié)點(diǎn)記錄對(duì)應(yīng)的無(wú)向圖或有向有圈圖節(jié)點(diǎn)對(duì)象的指針,而在無(wú)向圖或有向有圈圖節(jié)點(diǎn)對(duì)象的成員變量m_Flag中記錄一個(gè)樹(shù)節(jié)點(diǎn)的句柄,該節(jié)點(diǎn)為展開(kāi)樹(shù)節(jié)點(diǎn)。
[0100]其過(guò)程如圖3所示。各步驟說(shuō)明如下:
[0101]步驟301:開(kāi)始。
[0102]步驟302:將起點(diǎn)加入到當(dāng)前層中。以下的搜索針對(duì)當(dāng)前層中的節(jié)點(diǎn)。
[0103]步驟303:檢查當(dāng)前層中是否存在沒(méi)有進(jìn)行處理的節(jié)點(diǎn)。
[0104]步驟304:如果當(dāng)前層中還存在沒(méi)有處理的節(jié)點(diǎn),則取出一個(gè)節(jié)點(diǎn)。
[0105]步驟305:判斷該節(jié)點(diǎn)成員變量m_Flag是否為未搜索狀態(tài)。
[0106]步驟306:如果該節(jié)點(diǎn)成員變量m_Flag是未搜索狀態(tài),表示它的子節(jié)點(diǎn)沒(méi)有展開(kāi),則在樹(shù)窗口中顯示它的子節(jié)點(diǎn),同時(shí)在這些樹(shù)窗口的子節(jié)點(diǎn)中記錄對(duì)應(yīng)的節(jié)點(diǎn)指針,最后將當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹(shù)節(jié)點(diǎn)句柄記錄在當(dāng)前節(jié)點(diǎn)的成員變量m_FIag中。
[0107]步驟307:將當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)加入到下一層中。
[0108]步驟309:如果當(dāng)前層所有的節(jié)點(diǎn)都已處理,即不存在未處理節(jié)點(diǎn),則檢查是否到達(dá)最后一層。
[0109]步驟308:如果沒(méi)有到達(dá)最后一層,則將下一層設(shè)置為當(dāng)前層,轉(zhuǎn)到步驟303,重復(fù)以上過(guò)程。
[0110]步驟310:如果達(dá)到最后一層,說(shuō)明全部節(jié)點(diǎn)都已遍歷,則退出當(dāng)前過(guò)程。
[0111]本步驟完成后,圖1的數(shù)據(jù)將得到圖4的顯示結(jié)果,圖2的數(shù)據(jù)將得到圖5的顯示結(jié)果。
[0112]步驟5:擴(kuò)展處理
[0113]擴(kuò)展處理主要包括兩個(gè)操作:關(guān)聯(lián)節(jié)點(diǎn)顯示操作和展開(kāi)節(jié)點(diǎn)顯示操作。
[0114]對(duì)于關(guān)聯(lián)節(jié)點(diǎn)顯示操作,在對(duì)右鍵的消息響應(yīng)程序里,可以用一個(gè)循環(huán)語(yǔ)句獲得當(dāng)前節(jié)點(diǎn)所有邊的另一個(gè)端點(diǎn),然后將其顯示在一個(gè)對(duì)話框中。如圖6所示,當(dāng)鼠標(biāo)落在樹(shù)節(jié)點(diǎn)“11”時(shí),點(diǎn)擊右鍵,系統(tǒng)彈出一個(gè)標(biāo)題為“與“11”相連的節(jié)點(diǎn)”對(duì)話框,顯示所有與節(jié)點(diǎn)“11”相連的節(jié)點(diǎn)。
[0115]對(duì)于展開(kāi)節(jié)點(diǎn)顯示操作,首先構(gòu)造一個(gè)雙擊響應(yīng)程序,在該段程序里,檢查當(dāng)前樹(shù)節(jié)點(diǎn)是否是展開(kāi)樹(shù)節(jié)點(diǎn),如果是展開(kāi)樹(shù)節(jié)點(diǎn),則該段程序可直接退出;如果不是展開(kāi)樹(shù)節(jié)點(diǎn),則在樹(shù)窗口中選擇對(duì)應(yīng)的展開(kāi)樹(shù)節(jié)點(diǎn)。如果該節(jié)點(diǎn)的展開(kāi)樹(shù)節(jié)點(diǎn)不在當(dāng)前窗口的顯示范圍內(nèi),則系統(tǒng)會(huì)自動(dòng)移動(dòng)樹(shù)窗口的顯示內(nèi)容而使該節(jié)點(diǎn)的展開(kāi)節(jié)點(diǎn)可視。例如,在圖4中雙擊圖形標(biāo)志為三角形(“▲”或“Λ”)的樹(shù)節(jié)點(diǎn)“11”(圖4中虛圓框部分),則系統(tǒng)找到圖形標(biāo)志為矩形(“■”或“□”)的樹(shù)節(jié)點(diǎn)“11”(圖7中虛圓框部分),并將其選擇為當(dāng)前節(jié)點(diǎn)。
[0116]本具體實(shí)施步驟適合一般的計(jì)算機(jī)系統(tǒng)關(guān)于無(wú)向圖或有向有圈圖的顯示。對(duì)本領(lǐng)域的普通技術(shù)人員而言,本發(fā)明所涉及的數(shù)據(jù)結(jié)構(gòu)和算法可以在一般的計(jì)算機(jī)系統(tǒng)中實(shí)現(xiàn),舉例而言,可以使用VC++、Java等任何高級(jí)程序設(shè)計(jì)語(yǔ)言加以實(shí)現(xiàn)。
[0117]本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種無(wú)向圖或有向有圈圖的層次化顯示方法,其特征在于,所述方法包括如下步驟: (1)創(chuàng)建無(wú)向圖或有向有圈圖的起點(diǎn); (2)讀入數(shù)據(jù)文件,根據(jù)三元組數(shù)據(jù)文件構(gòu)建無(wú)向圖或有向有圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成無(wú)向圖或有向有圈圖的內(nèi)部模型; (3)初始化,將節(jié)點(diǎn)數(shù)據(jù)對(duì)象的搜索標(biāo)志設(shè)置為未搜索; (4)對(duì)無(wú)向圖或有向有圈圖的模型進(jìn)行寬度優(yōu)先搜索并顯示,從核心點(diǎn)或起點(diǎn)開(kāi)始,一層一層向外搜索并顯示每個(gè)無(wú)向圖或有向有圈圖的節(jié)點(diǎ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),將其顯示在樹(shù)窗口當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的樹(shù)節(jié)點(diǎn)的下面作為子節(jié)點(diǎn);這些樹(shù)窗口的子節(jié)點(diǎn)記錄它們所對(duì)應(yīng)的模型節(jié)點(diǎn)的指針,同時(shí)將當(dāng)前模型節(jié)點(diǎn)的標(biāo)志設(shè)置為已擴(kuò)展,其值為對(duì)應(yīng)樹(shù)節(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ù)文件中讀入無(wú)向圖或有向有圈圖的核心點(diǎn); 從數(shù)據(jù)文件中讀入三元組數(shù)據(jù),并依據(jù)這些數(shù)據(jù)構(gòu)建無(wú)向圖或有向有圈圖中所有的模型節(jié)點(diǎn)和有向線段,形成無(wú)向圖或有向有圈圖的內(nèi)部模型; 數(shù)據(jù)文件讀入后,再將核心點(diǎn)與起點(diǎn)連接起來(lái); 所述三元組用來(lái)描述無(wú)向圖或有向有圈圖中的任一條線段E:E= (Nin, R,Ntjut),這里Nin表示E的一個(gè)端點(diǎn)Arat表示E的另一個(gè)端點(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)顯示當(dāng)前節(jié)點(diǎn)的相連節(jié)點(diǎn)或當(dāng)前節(jié)點(diǎn)的展開(kāi)節(jié)點(diǎn);所述擴(kuò)展處理包括關(guān)聯(lián)節(jié)點(diǎn)顯示操作或展開(kāi)節(jié)點(diǎn)顯示操作,其中: (5.1)關(guān)聯(lián)節(jié)點(diǎn)顯示操作:當(dāng)用戶需要觀察某一個(gè)節(jié)點(diǎn)的所有相關(guān)聯(lián)的節(jié)點(diǎn)時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹(shù)節(jié)點(diǎn)位置,然后單擊鼠標(biāo)右鍵彈出一個(gè)對(duì)話框,顯示當(dāng)前樹(shù)節(jié)點(diǎn)的所有相關(guān)聯(lián)的節(jié)點(diǎn); (5.2)展開(kāi)節(jié)點(diǎn)顯示操作:當(dāng)用戶需要觀察某一個(gè)節(jié)點(diǎn)的展開(kāi)的子節(jié)點(diǎn)情況時(shí),將鼠標(biāo)移到該節(jié)點(diǎn)的樹(shù)節(jié)點(diǎn)位置,然后雙擊鼠標(biāo)左鍵,樹(shù)窗口自動(dòng)將當(dāng)前節(jié)點(diǎn)的展開(kāi)節(jié)點(diǎn)作為選擇節(jié)點(diǎn)。
【文檔編號(hào)】G06F3/0481GK104461497SQ201410605691
【公開(kāi)日】2015年3月25日 申請(qǐng)日期:2014年10月30日 優(yōu)先權(quán)日:2014年10月30日
【發(fā)明者】尹文生, 尹強(qiáng) 申請(qǐng)人:華中科技大學(xué)