版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
PAGEXXPAGEXXIPAGEI《軟件工程上機實驗》實驗報告書——科研管理系統(tǒng)專業(yè)班級學(xué)號姓名指導(dǎo)教師安徽工業(yè)大學(xué)簡介此次試驗,要求完成可視化的科研管理系統(tǒng)。將自己在軟件工程課程中學(xué)習(xí)到的軟件設(shè)計的知識運用的實際中,加深對知識的理解,也增強自己動手的實踐能力。開發(fā)環(huán)境和開發(fā)工具:WINDOWS操作平臺上,使用MSvc6.0+sqlserver2000試驗步驟需求分析:分析該系統(tǒng)需要完成的功能,需要什么開發(fā)工具和數(shù)據(jù)庫管理軟件數(shù)據(jù)庫設(shè)計:分析系統(tǒng)的數(shù)據(jù),畫出數(shù)據(jù)庫的E-R圖,并在此基礎(chǔ)上完成數(shù)據(jù)庫表的設(shè)計和初始數(shù)據(jù)的輸入數(shù)據(jù)流圖的設(shè)計:仿照用戶的使用習(xí)慣,分析從系統(tǒng)啟動到系統(tǒng)退出系統(tǒng)數(shù)據(jù)的使用系統(tǒng)功能模塊的設(shè)計:按照數(shù)據(jù)流圖的需要,分析出系統(tǒng)需要哪些模塊來完成需求分析中提出的功能需求實現(xiàn)和編碼:在選定的平臺上上運用開發(fā)工具和數(shù)據(jù)庫管理軟件進行系統(tǒng)的開發(fā)測試:每完成一個模塊和重要函數(shù),進行相應(yīng)的單元測試;系統(tǒng)完成之后,需要系統(tǒng)測試迭代:根據(jù)測試的結(jié)果進行迭代,從而形成一個完整可用的系統(tǒng)需求分析系統(tǒng)將采用先進的信息化技術(shù),并有效結(jié)合現(xiàn)代科研管理理念和學(xué)校科研管理實際情況。系統(tǒng)的成功建設(shè)將能夠輕松解決傳統(tǒng)科研管理中難以解決的系列問題,并在多個方面實現(xiàn)突破:實現(xiàn)標準化的科研信息系統(tǒng):系統(tǒng)將采用了國家教育部信息化標準,完全兼容了“全國普通高等學(xué)校人文社會科學(xué)研究管理系統(tǒng)”,同時也充分體現(xiàn)學(xué)校的科研管理辦法和有關(guān)精神。系統(tǒng)將采集和管理標準完整的科研機構(gòu)、人員、項目和成果等基礎(chǔ)數(shù)據(jù),避免了數(shù)據(jù)的無效性和不規(guī)范性,為以后的管理工作打下堅實基礎(chǔ)。
構(gòu)建開放式的科研管理體系:系統(tǒng)將向全校所有從事科研活動或者科研輔助工作的老師開放,并和學(xué)校人事處等業(yè)務(wù)部分建立數(shù)據(jù)共享機制。系統(tǒng)將徹底改變以前封閉式的管理模式,解決系統(tǒng)數(shù)據(jù)對內(nèi)對外的開放性問題。
科學(xué)分析和決策支持:系統(tǒng)能夠及時收集到學(xué)校最新的科研項目、科研成果和學(xué)術(shù)活動等業(yè)務(wù)數(shù)據(jù),并在大量的數(shù)據(jù)基礎(chǔ)上進行數(shù)據(jù)挖掘分析工作。既方便學(xué)校進行各種查詢,也可以提供各種分析報表。系統(tǒng)能夠為學(xué)??蒲泄芾頉Q策提供科學(xué)有效的輔助支持。
科研信息化管理的全方位整體解決方案:系統(tǒng)針對學(xué)校的日常管理需要,提出的是一個包括信息發(fā)布、辦公自動化和科研管理等多方面的整體解決方案。這樣避免了臨時的不完整的信息化建設(shè),一次性的滿足了科研管理中多方面的需要。2.1可行性分析系統(tǒng)基于windows操作系統(tǒng)環(huán)境,在單機上進行測試和使用,主要功能完備,可以運行。2.2基本功能需求1.系統(tǒng)分成三級用戶,不同用戶登錄界面相同,但是具有的功能不同2.超級管理員能夠進行所有的增刪查修操作,一般管理員可以對項目等進行增刪查修,但是不能對和自己高級同級的用戶進行操作3.實現(xiàn)基本信息的各種操作(如學(xué)院,部門,委托單位,論文級別,專家等),需要超級管理員的權(quán)限4.管理員以上可以實現(xiàn)各種項目、論文、著作、專利的輸入工作5.普通用戶可以實現(xiàn)項目信息的查詢工作數(shù)據(jù)流圖樹形結(jié)構(gòu)的數(shù)據(jù)流圖如下所示:第五章系統(tǒng)模塊結(jié)構(gòu)圖1.登陸界面:主要功能點:從數(shù)據(jù)庫中讀取數(shù)據(jù),看用戶名和密碼的正確性;如果用戶名輸入不正確,提示用戶名輸入錯誤;如果密碼輸入不正確,提示密碼輸入錯誤;如果登陸次數(shù)多于五次,自動退出系統(tǒng);用戶名和密碼正確,則進入系統(tǒng)主界面。主要代碼:if(m_strUsername.IsEmpty()||m_strPassword.IsEmpty()) { AfxMessageBox("請將資料填寫完整再登錄!"); return; } theApp.id=m_strUsername; theApp.m_pRS.ADOExcute("selectpassword,uright,namefromuserinfowhereid='"+m_strUsername+"'"); if(theApp.m_pRS.nFieldRows==1) { str=theApp.m_pRS.GetFieldString(0); str.TrimLeft(); str.TrimRight(); if(theApp.trytime>=5) {//如果登錄次數(shù)超過五次不成功的話,則退出系統(tǒng) PostQuitMessage(WM_QUIT); } if(str!=m_strPassword) { theApp.trytime++; AfxMessageBox("錯誤的密碼!"); } else { npower=theApp.m_pRS.GetFieldNumber(1); theApp.power=npower; if(npower==1) power="超級管理員"; elseif(npower==2) power="管理員"; else power="普通用戶"; CMainDlg*maindlg; maindlg=newCMainDlg(); maindlg->Create(IDD_MAINDLG_DIALOG); this->ShowWindow(SW_HIDE); maindlg->ShowWindow(SW_SHOW); maindlg->Initial(theApp.m_pRS.GetFieldString(2),power,npower); } } else { AfxMessageBox("錯誤的用戶名!"); }2.系統(tǒng)主界面主要功能點:系統(tǒng)功能采用樹形菜單映射的方式,分為設(shè)置和管理兩大部分;設(shè)置主要是設(shè)置一些基礎(chǔ)信息,比如在下拉框中需要選擇的信息,比如學(xué)院,委托單位,論文等級等等,需要超級管理員權(quán)限;管理是系統(tǒng)主要功能在管理菜單下,普通用戶只能查看相關(guān)信息,管理員以上可以增刪查改相關(guān)信息;主界面分成三個部分,樹形目錄是不會發(fā)生改變的,始終顯示在界面上;列表也是始終顯示在界面上的,根據(jù)用戶單擊樹形目錄選擇相關(guān)的信息顯示在其中;第三部分,則是根據(jù)用戶單擊的選項來動態(tài)變化的,若單擊用戶管理,則顯示用戶管理的界面,如下示:系統(tǒng)配有相應(yīng)的菜單項,工具欄,和狀態(tài)欄,前兩者用來映射樹形目錄功能,后者則是用來顯示用戶ID和用戶權(quán)限以及當前系統(tǒng)時間的。主要代碼如下:List表格刷新函數(shù) m_ctrlList.GetClientRect(&rect);//獲取列表控件的矩形 m_ctrlList.DeleteAllItems(); while(m_ctrlList.DeleteColumn(0)); //先插入列號 try{ for(i=0;i<colums;i++) { strText=theApp.m_pRS.GetFieldName(i); lvColumn.mask=LVCF_TEXT|LVCF_FMT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_LEFT; lvColumn.cx=rect.right/colums; if(lvColumn.cx<100) lvColumn.cx=100; lvColumn.pszText=strText.GetBuffer(strText.GetLength()); //插入列 m_ctrlList.InsertColumn(i,&lvColumn); } i=0; while(!theApp.m_pRS.ADOEOF()) { m_ctrlList.InsertItem(i,"%d",i); for(j=0;j<colums;j++) { m_ctrlList.SetItemText(i,j,theApp.m_pRS.GetFieldString(j)); } theApp.m_pRS.MoveNext(); i++; } } catch(...) { AfxMessageBox("數(shù)據(jù)庫讀取失敗!"); return; }選擇相應(yīng)窗口函數(shù):CStringstrText,strSQL; HTREEITEMhTreeItem; hTreeItem=m_ctrltree.GetSelectedItem(); strText=m_ctrltree.GetItemText(hTreeItem); if(strText=="用戶管理") { if(power==1)//是超級管理員的話 strSQL="selectID,name,password,urightfromuserinfo"; else strSQL.Format("select*fromuserinfowhereuright>%dorname='%s'",power,name); userinfo.ShowWindow(SW_SHOW); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="橫向管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_SHOW); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="縱向管理") { strSQL="select*fromvertiproj"; userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_SHOW); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="論文管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_SHOW); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_HIDE); } elseif(strText=="專著管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_SHOW); patent.ShowWindow(SW_HIDE); } elseif(strText=="專利管理") { userinfo.ShowWindow(SW_HIDE); horizproj.ShowWindow(SW_HIDE); vertiproj.ShowWindow(SW_HIDE); article.ShowWindow(SW_HIDE); compose.ShowWindow(SW_HIDE); patent.ShowWindow(SW_SHOW); } theApp.m_pRS.ADOExcute(strSQL); RefreshList();3.單擊list控件中相應(yīng)項在下面的子窗體中顯示詳細信息的函數(shù):CStringid; intcur=m_ctrlList.GetSelectionMark(); intall=m_ctrlList.GetItemCount(); if(cur>=0&&cur<all) {//先查看選中的是否在顯示的范圍之內(nèi) id=m_ctrlList.GetItemText(cur,0); if(userinfo.IsWindowVisible())//判斷窗口是否是顯示的 userinfo.Display(id); elseif(vertiproj.IsWindowVisible()) vertiproj.Display(id); elseif(horizproj.IsWindowVisible()) horizproj.Display(id); elseif(article.IsWindowVisible()) article.Display(id); elseif(compose.IsWindowVisible()) compose.Display(id); elseif(patent.IsWindowVisible()) patent.Display(id); }4.主窗口初始化函數(shù):狀態(tài)欄數(shù)據(jù)結(jié)構(gòu):staticUINTindicators[]={ ID_INDICATOR_USER, ID_INDICATOR_TIME, ID_INDICATOR_POWER,};初始化狀態(tài)欄: UINTnID; CRectrect; GetClientRect(rect); this->m_nwndStatusBar.Create(this); this->m_nwndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)); m_nwndStatusBar.MoveWindow(0,rect.bottom-20,rect.right,20); m_nwndStatusBar.SetPaneStyle(2,SBPS_STRETCH); m_nwndStatusBar.SetPaneInfo(0,nID,SBPS_STRETCH|SBPS_NOBORDERS,rect.right/3-20); m_nwndStatusBar.SetPaneText(0,”當前用戶:”+user); m_nwndStatusBar.SetPaneInfo(1,nID,SBPS_STRETCH|SBPS_NOBORDERS,rect.right/3-20); m_nwndStatusBar.SetPaneText(1,”用戶權(quán)限:”+spower); m_nwndStatusBar.SetPaneInfo(2,nID,SBPS_STRETCH|SBPS_NOBORDERS,rect.right/3); SetTimer(1,1000,NULL);樹形目錄的初始化: hRootItem=m_ctrltree.InsertItem("科研管理系統(tǒng)",0,2,TVI_ROOT,TVI_LAST); HTREEITEMhsetup=m_ctrltree.InsertItem("設(shè)置",1,2,hRootItem,TVI_LAST); HTREEITEMhmanage=m_ctrltree.InsertItem("管理",1,2,hRootItem,TVI_LAST); HTREEITEMhset_school=m_ctrltree.InsertItem("學(xué)院設(shè)置",2,2,hsetup,TVI_LAST);HTREEITEMhset_task_type=m_ctrltree.InsertItem("課題類型設(shè)置",2,2,hsetup,TVI_LAST); HTREEITEMhset_article_type=m_ctrltree.InsertItem("論文類型設(shè)置",2,2,hsetup,TVI_LAST); HTREEITEMhset_embody_level=m_ctrltree.InsertItem("級別收錄設(shè)置",2,2,hsetup,TVI_LAST); HTREEITEMhset_submit_cor=m_ctrltree.InsertItem("委托單位設(shè)置",2,2,hsetup,TVI_LAST); HTREEITEMhma_horizinal=m_ctrltree.InsertItem("橫向管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_verticle=m_ctrltree.InsertItem("縱向管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_article=m_ctrltree.InsertItem("論文管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_monography=m_ctrltree.InsertItem("專著管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_patent=m_ctrltree.InsertItem("專利管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_identification=m_ctrltree.InsertItem("鑒定管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_reward=m_ctrltree.InsertItem("獲獎管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_expert=m_ctrltree.InsertItem("專家管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_basinfo=m_ctrltree.InsertItem("基本信息管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_store=m_ctrltree.InsertItem("轉(zhuǎn)儲管理",2,2,hmanage,TVI_LAST); HTREEITEMhma_user=m_ctrltree.InsertItem("用戶管理",2,2,hmanage,TVI_LAST);時間刷新定時器設(shè)置://TODO:Addyourmessagehandlercodehereand/orcalldefault CTimetime; intweek; time=CTime::GetCurrentTime(); week=time.GetDayOfWeek();//獲取星期幾,注意1為星期天,7為星期六 CStrings=time.Format("當前時間:%Y-%m-%d%H:%M:%S星期");//月份是小寫的,分鐘是大寫的switch(week) { case1:s+="日";break; case2:s+="一";break; case3:s+="二";break; case4:s+="三";break; case5:s+="四";break; case6:s+="五";break; case7:s+="六";break; } m_nwndStatusBar.SetPaneText(2,s);第六章測試與調(diào)試1.測設(shè)用例設(shè)計用例ID問題描述輸入數(shù)據(jù)預(yù)期輸出實際輸出1登陸界面,用戶名錯誤用戶名:aaaa密碼:aaaa提示用戶名錯誤彈出提示框,提示用戶名錯誤(圖c_1)2登陸界面,沒有任何信息用戶名:空密碼:空提示為空彈出提示框,提示填寫完整后再登陸(圖c_2)3登陸界面,密碼錯誤用戶名:admin密碼:admi提示密碼錯誤彈出提示框,提示密碼錯誤(圖c_3)4登陸界面,全部正確,超級管理員用戶名:admin密碼:admin進入主界面狀態(tài)欄顯示“超級管理員”進入主界面狀態(tài)欄顯示“超級管理員”5登陸界面,全部正確,一般管理員用戶名:rsq密碼:342601進入主界面狀態(tài)欄顯示“管理員”進入主界面狀態(tài)欄顯示“管理員”,沿樹形目錄打開“用戶管理”時,用戶權(quán)限位是“普通用戶”6登陸界面,全部正確,普通用戶用戶名:PT密碼:PT進入主界面狀態(tài)欄顯示“普通用戶”進入主界面狀態(tài)欄顯示“普通用戶”,沿樹形目錄打開“用戶管理”時,用戶權(quán)限位是“普通用戶”,且沒有增加和刪除功能用例ID問題描述輸入數(shù)據(jù)預(yù)期輸出實際輸出7主功能模塊,增加用戶,以超級管理員身份登陸用戶名:ren密碼:ren用戶姓名:ren用戶權(quán)限:普通用戶提示:增加用戶成功,數(shù)據(jù)庫中用戶記錄增加一條提示:增加用戶成功(圖c_4),數(shù)據(jù)庫中用戶記錄增加一條8主功能模塊,增加用戶,以超級管理員身份登陸用戶名:sheng密碼:sheng用戶姓名:sheng用戶權(quán)限:普通用戶資料不完整,增加用戶失敗提示:增加失敗,資料不完整(圖c_5)9主功能模塊,刪除用戶,管理員身份登陸在list框中選擇一條要刪除的記錄,單擊刪除刪除成功,數(shù)據(jù)庫中減少一條記錄提示:成功刪除(圖c_6)10主功能模塊,修改用戶信息,普通用戶登陸列表框中之后自己的信息,單擊選中,修改信息后,選擇“修改”修改成功,數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生相應(yīng)改變提示:修改成功,數(shù)據(jù)庫中的書庫發(fā)生相應(yīng)變化(圖c_7)11主功能模塊,修改用戶信息,普通用戶登陸列表框中之后自己的信息,單擊選中,修改信息,使得用戶姓名不全,單擊“修改”按鈕修改失敗提示:修改失敗,資料不完整(圖c_8);12主功能模塊,單擊樹形控件中的其他項目,檢查界面發(fā)生的變化在界面為用戶管理界面時,單擊“縱向管理”界面發(fā)生改變,詳細信息部分變成縱向管理的界面,同時,列表框中的數(shù)據(jù)變成縱向項目的數(shù)據(jù)界面發(fā)生改變,詳細信息部分變成縱向管理的界面,同時,列表框中的數(shù)據(jù)變成縱向項目的數(shù)據(jù)13主功能界面初始化數(shù)據(jù)單擊“縱向管理”詳細信息模塊變成“縱向管理”模塊的界面,在下來選擇框中,委托單位,項目類別,以及參加人的院的待選項為從數(shù)據(jù)庫基礎(chǔ)信息中讀入的信息詳細信息模塊變成“縱向管理”模塊的界面,在下來選擇框中,委托單位,項目類別,以及參加人的院的待選項為從數(shù)據(jù)庫基礎(chǔ)信息中讀入的信息圖c_1圖c_2圖c_3圖c_4圖c_5圖c_6圖c_7圖c_8發(fā)現(xiàn)的問題當用戶在增加或者刪除一條記錄后,在列表框中沒有及時更新其內(nèi)容,必須要到樹形控件中重新單擊一次該內(nèi)容對應(yīng)的樹形目錄,才能刷新。原因在于子對話框成員函數(shù)無法調(diào)用父對話框成員函數(shù)??梢酝ㄟ^自己生成一個消息的形式來解決,即為父對話框(系統(tǒng)主界面)設(shè)計一個消息,然后每次子窗口增加,修改或刪除一條記錄后,將這個消息發(fā)送給操作系統(tǒng),讓操作系統(tǒng)來通知主界面的及時更新。在設(shè)計數(shù)據(jù)庫時,為了體現(xiàn)各表間的關(guān)系,外鍵設(shè)置的比較復(fù)雜。但是,在用系統(tǒng)時,經(jīng)常會發(fā)生破壞這種依賴關(guān)系的操作,導(dǎo)致操作失敗。不知道能否找到一個權(quán)衡點,來平衡這種操作。上課時,老師說道,在顯示數(shù)據(jù)庫中信息時,不要一次性全部顯示,而是選擇前面多少條。這里我沒有實現(xiàn)這樣的功能,而且不知道該怎樣實現(xiàn)。我們在數(shù)據(jù)庫學(xué)習(xí)中也沒有涉及到這一方面的內(nèi)容??茖W(xué)數(shù)據(jù)可視化操作算法設(shè)計分析摘要隨著科學(xué)數(shù)據(jù)可視化技術(shù)在各領(lǐng)域內(nèi)的廣泛應(yīng)用,出現(xiàn)了相當數(shù)量的科學(xué)數(shù)據(jù)可視庫供開發(fā)者進行二次開發(fā),例如:OpenGL、IDL、PGL等。這些庫提供了強大的圖形生成功能。本論文利用了PGL庫并進行了二次開發(fā),而且加強了它的功能,使在可視化操作時更為方便簡單。本文在對科學(xué)數(shù)據(jù)可視化的基本概念簡單介紹后,還介紹了實現(xiàn)可視化操作的一些具體算法,如:構(gòu)造一個可視化區(qū)域算法、構(gòu)造一個坐標軸算法、將科學(xué)數(shù)據(jù)轉(zhuǎn)換成圖形對象算法、選擇移動圖形對象算法等。同時,為檢驗算法的正確性,用VisualC++開發(fā)了一個科學(xué)數(shù)據(jù)可視化演示系統(tǒng)。經(jīng)演示系統(tǒng)測試,這些算法運行效率較好。本文所設(shè)計的算法,以類庫的形式提供給其他開發(fā)者直接使用或做進一步的完善。關(guān)鍵字:科學(xué)數(shù)據(jù),MFC,可視化,面像對象設(shè)計,STL,BOOST,PGL
AbstractWiththewideapplicationoftechnologyofScientificDataVisualizationinmanyfields,therearesomegoodlibraries,suchasOpenGL,IDLandPGL,whichcanmakeiteasyfordeveloperstocarryouttheirdevelopment.TheselibrarieshavestrongprocessfunctionsthatmakeanobjectofimagewithScientificData.ThethesisusethelibrariesofPGLtodevelopmentsoftwareofScientificDataVisualization,andmakethesoftwareusecomfortablyandhaveastrongfunction.AftersimplyintroducingthebasicconceptofScientificDataVisualization,manyalgorithmsandtheircharacteristicshavebeenanalyzedindetail,suchasbuildingaregionofvisualization,anaxe,asolutiontochangescientificdatatoagraphicalobject,andselectingandmovinggraphicalobjectbymouse,etc.Inordertotesttheexactnessandeffectiveofthosealgorithms,animageprocessdemonstrationsystemhasbeendevelopedbymeansofusingSTLandBOOSTlibrariesandtheresultshavedemonstratedthatthesealgorithmsespeciallyinefficiencyofoperationofVisualizationhavemanyadvantages.DesignedalgorithmsinthisthesisareofferedotherdeveloperstouseordofurtherperfectionintheformofClasslibrarydirectly.Keywords:ScientificData,MFC,Visualization,Object-orienteddesign,STL,BOOST,PGLPAGE2目錄TOC\o\f\h\z摘要 IAbstract II第1章緒論 11.1什么是科學(xué)數(shù)據(jù)可視化 11.2發(fā)展概況及應(yīng)用領(lǐng)域 11.3科學(xué)數(shù)據(jù)可視化主要研究的內(nèi)容 21.4本論文的目的及主要內(nèi)容 3第2章 基礎(chǔ)知識 42.1STL簡介 42.1.1STL算法 42.1.2STL容器 52.1.3STL迭代器 62.2BOOST簡介 6第3章 科學(xué)數(shù)據(jù)可視化的概述 83.1科學(xué)數(shù)據(jù)可視化的基本概念 83.1.1科學(xué)數(shù)據(jù) 83.1.2可視化 83.1.3科學(xué)數(shù)據(jù)可視化的原理概述 83.2科學(xué)數(shù)據(jù)可視化的表示模型 93.2.1科學(xué)數(shù)據(jù)模型 103.2.2坐標軸模型 103.2.3圖形圖像模型 113.3科學(xué)數(shù)據(jù)可視化的發(fā)展趨勢 11第4章 科學(xué)數(shù)據(jù)可視化總體的設(shè)計 134.1科學(xué)數(shù)據(jù)可視化的類包設(shè)計 134.2科學(xué)數(shù)據(jù)可視化設(shè)計中使用的數(shù)據(jù)結(jié)構(gòu) 144.2.1Vector結(jié)構(gòu) 144.2.2Shared_ptr結(jié)構(gòu) 16第5章科學(xué)數(shù)據(jù)可視化的主要類及算法描述 175.1CPGLRegion類: 185.2CPGLObject類: 205.3CPGLAxe2D類: 225.4CPGLVector類: 245.5CPGLLine2D類: 25第6章科學(xué)數(shù)據(jù)可視化的具體實現(xiàn) 266.1科學(xué)數(shù)據(jù)的組織 266.2科學(xué)數(shù)據(jù)到圖形對象的轉(zhuǎn)換 266.3將圖形對象的添加到Region 276.4實現(xiàn)圖形可視化操作 276.4實現(xiàn)圖形視圖的導(dǎo)出 32第7章演示系統(tǒng) 346.1主要功能運行實例 356.2系統(tǒng)主要特點 39第7章結(jié)束語 40參考文獻 41第1章緒論湖南師范大學(xué)本科畢業(yè)論文PAGE3第1章緒論1.1什么是科學(xué)數(shù)據(jù)可視化現(xiàn)代的科學(xué)數(shù)據(jù)可視化(ScientificDataVisualization)技術(shù)指的是運用計算機圖形學(xué)和圖像處理技術(shù),將數(shù)據(jù)換為圖形或圖像在屏幕上顯示出來,并進行交互處理的理論、方法和技術(shù)。它涉及到計算機圖形學(xué)、圖像處理、計算機輔助設(shè)計、計算機視覺及人機交互技術(shù)等多個領(lǐng)域。數(shù)據(jù)可視化概念首先來自科學(xué)計算可視化(VisualizationinScientificComputing),科學(xué)家們不僅需要通過圖形圖像來分析由計算機算出的數(shù)據(jù),而且需要了解在計算過程中數(shù)據(jù)的變化。隨著計算機技術(shù)的發(fā)展,數(shù)據(jù)可視化概念已大大擴展,它不僅包括科學(xué)計算數(shù)據(jù)的可視化,而且包括工程數(shù)據(jù)和測量數(shù)據(jù)的可視化。學(xué)術(shù)界常把這種空間數(shù)據(jù)的可視化稱為可視化(VolumeVisualization)技術(shù)[1]。1.2發(fā)展概況及應(yīng)用領(lǐng)域近年來,隨著網(wǎng)絡(luò)技術(shù)和電子商務(wù)的發(fā)展,對科學(xué)數(shù)據(jù)的研究提出了更高的要求,科學(xué)數(shù)據(jù)可視化技術(shù)隨之發(fā)展起來。我們可以通過數(shù)據(jù)可視化技術(shù),發(fā)現(xiàn)大量金融、通信和商業(yè)數(shù)據(jù)中隱含的規(guī)律,從而為決策提供依據(jù)。這已成為數(shù)據(jù)可視化技術(shù)中新的熱點。為適應(yīng)硬件平臺、操作系統(tǒng)、網(wǎng)絡(luò)和通信方面的飛速發(fā)展,可視化的軟件產(chǎn)品在近幾年中發(fā)展很快,其中以AVS/Express開發(fā)版、IDL(包括VIP、ION)和PV-WAVE等為代表??茖W(xué)數(shù)據(jù)可視化的應(yīng)用十分廣泛,幾乎可以應(yīng)用于自然科學(xué)、工程技術(shù)、金融、通信和商業(yè)等各種領(lǐng)域在國民經(jīng)濟中發(fā)揮著越來越大的作用。其中數(shù)據(jù)可視化主要應(yīng)用在以下幾個領(lǐng)域。=1\*GB3①醫(yī)學(xué)醫(yī)學(xué)數(shù)據(jù)的可視化,已成為科學(xué)數(shù)據(jù)可視化領(lǐng)域中最為活躍的研究領(lǐng)域之一。由于近代非侵入診斷技術(shù)如CT、MRI和正電子放射斷層掃描(PET)的發(fā)展,醫(yī)生已經(jīng)可以較易獲得病人有關(guān)部位的一組二維斷層圖象。=2\*GB3②油氣勘探由于地震數(shù)據(jù)及測井數(shù)據(jù)的數(shù)據(jù)量極其龐大,而且分布不均勻,因而無法根據(jù)紙面上的數(shù)據(jù)作出分析。利用可視化技術(shù)可以從大量的地質(zhì)勘探數(shù)據(jù)或測井數(shù)據(jù)中,構(gòu)造出感興趣的等值面、等值線,并顯示其范圍及走向,并用不同顏色顯示出多種參數(shù)及其相互關(guān)系,從而使專業(yè)人員能對原始數(shù)據(jù)做出正確解釋,得到礦藏是否存在、礦藏位置及儲量大小等重要信息。=3\*GB3③氣象預(yù)報科學(xué)數(shù)據(jù)可視化可將大量的數(shù)據(jù)轉(zhuǎn)換為圖像,在屏幕上顯示出某一時刻的等壓面、等溫面、旋渦、云層的位置及運動、暴雨區(qū)的位置及其強度、風(fēng)力的大小及方向等,使預(yù)報人員能對未來的天氣做出準確的分析和預(yù)測。④工程計算機輔助工程(CAE)包括計算機輔助設(shè)計(CAD)、計算機輔助制造(CAM)和計算機輔助運行等多項內(nèi)容??梢暬夹g(shù)有助于整個工程過程一體化和流程化,并能使工程的領(lǐng)導(dǎo)和技術(shù)人員看到和了解過程中參數(shù)變化對整體的動態(tài)影響,從而達到縮短研制周期、節(jié)省工程全壽命費用的目的1.3科學(xué)數(shù)據(jù)可視化主要研究的內(nèi)容科學(xué)數(shù)據(jù)可視化研究的主要內(nèi)容包含以下幾個方面:科學(xué)數(shù)據(jù)的組織:對科學(xué)數(shù)據(jù)進行合理的收集,人們使用特定的工具(如數(shù)據(jù)采集器等)對數(shù)據(jù)進行采樣分析,將收集的信息進行過濾獲取感興趣的部分。實時圖形生成技術(shù):將科學(xué)數(shù)據(jù)轉(zhuǎn)化成圖形,可使在分析科學(xué)數(shù)據(jù)時,提供界面友好圖形信息、支持各種鼠標操作。通過對科學(xué)數(shù)據(jù)圖形化可使操作者有一種感觀上的了解,從而更好的分析數(shù)據(jù)、發(fā)現(xiàn)數(shù)據(jù)的規(guī)律并做出正確的判斷。實時圖形生成技術(shù)主要有:二維圖形區(qū)域?qū)崟r圖形生成技術(shù)、三維數(shù)據(jù)模型實時生成技術(shù)、三維視角變換技術(shù)、數(shù)據(jù)模型的顯示和快速漫游數(shù)據(jù)技術(shù)。科學(xué)數(shù)據(jù)的存儲和壓縮:通常由于科學(xué)數(shù)據(jù)的數(shù)據(jù)量比較大,運用合理有效的存儲壓縮算法可提高磁盤的利用率并提高科學(xué)數(shù)據(jù)使用效率。數(shù)據(jù)可視化工具的開發(fā):研究開發(fā)數(shù)據(jù)可視化工具并使其支持科學(xué)數(shù)據(jù)的導(dǎo)入、導(dǎo)出、圖形化等操作。數(shù)據(jù)可視化算法研究:對科學(xué)數(shù)據(jù)圖形生成、存儲壓縮的算法研究。科學(xué)數(shù)據(jù)檢索系統(tǒng):對科學(xué)數(shù)據(jù)進行分析找出有用的、可利用的信息。1.4本論文的目的及主要內(nèi)容本論文的目的是:在首先選用合理的數(shù)據(jù)結(jié)構(gòu)組織好科學(xué)數(shù)據(jù),再通過分析數(shù)據(jù)的圖形生成技術(shù)和常用圖形生成算法思想的基礎(chǔ)上,然后使用VisualC++這個軟件開發(fā)工具以完全面向?qū)ο蟮拈_發(fā)模式設(shè)計出了一套科學(xué)數(shù)據(jù)可視化的工具,最后以類和控件的形式提供給其他開發(fā)者直接使用或做進一步的完善。本論文的主要內(nèi)容包含如下幾個方面:=1\*GB3①對C++所提供的常用的數(shù)據(jù)結(jié)構(gòu)進行簡單的描述和解釋,為科學(xué)數(shù)據(jù)生成圖算法的設(shè)計打下基礎(chǔ)。=2\*GB3②科學(xué)數(shù)據(jù)圖形生成算法的介紹。將科學(xué)數(shù)據(jù)以矩陣形式的文件格式存儲在計算機的存儲器中的。本論文以矩陣轉(zhuǎn)換成多條曲線圖形的算法為例并結(jié)合上述的數(shù)據(jù)結(jié)構(gòu),并對它們之間的轉(zhuǎn)換給出了算法描述。=3\*GB3③數(shù)據(jù)可視化工具的開發(fā)算法的介紹:可視區(qū)域的顯示范圍、可視區(qū)域的放大和縮小、可視區(qū)域的移動、可視區(qū)域中圖形曲線的選中、可視區(qū)域中圖形曲線的移動以及可視區(qū)域的恢復(fù)等給出了詳細的討論及算法描述。④數(shù)據(jù)可視化圖形導(dǎo)出文件格式介紹:BMP文件格式、JPEG文件格式、TIFF文件格式、PNG文件格式、EMF文件格式、EPS文件格式、SVG文件格式以及SVGZ文件格式。第2章基礎(chǔ)知識湖南師范大學(xué)本科畢業(yè)論文基礎(chǔ)知識由于在科學(xué)數(shù)據(jù)可視化開發(fā)時引用到了許多STL庫、BOOST庫中的內(nèi)容特此對它們進行一下總體概述。2.1STL簡介[2]STL(StandardTemplateLibrary,標準模板庫)是惠普實驗室開發(fā)的一系列軟件的統(tǒng)稱。它是由AlexanderStepanov、MengLee和DavidRMusser在惠普實驗室工作時所開發(fā)出來的?,F(xiàn)在雖說它主要出現(xiàn)在C++中,但在被引入C++之前該技術(shù)就已經(jīng)存在了很長的一段時間。STL的代碼從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(迭代器),幾乎所有的代碼都采用了模板類和模版函數(shù)的方式,這相比于傳統(tǒng)的由函數(shù)和類組成的庫來說提供了更好的代碼重用機會。在C++標準中,STL被組織為下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。以下筆者就簡單介紹一下STL各個部分的主要特點。2.1.1STL算法算法是大家都能取得的一個共識是函數(shù)庫,對數(shù)據(jù)類型的選擇對其可重用性起著至關(guān)重要的作用。舉例來說,一個求方根的函數(shù),在使用浮點數(shù)作為其參數(shù)類型的情況下的可重用性肯定比使用整型作為它的參數(shù)類性要高。而C++通過模板的機制允許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了相當多的有用算法。它是在一個有效的框架中完成這些算法的——可以將所有的類型劃分為少數(shù)的幾類,然后就可以在模版的參數(shù)中使用一種類型替換掉同一種類中的其他類型。STL提供了大約100個實現(xiàn)算法的模版函數(shù),比如算法for_each將為指定序列中的每一個元素調(diào)用指定的函數(shù),stable_sort以你所指定的規(guī)則對序列進行穩(wěn)定性排序等等。這樣一來,只要我們熟悉了STL之后,許多代碼可以被大大的化簡,只需要通過調(diào)用一兩個算法模板,就可以完成所需要的功能并大大地提升效率。算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。<algorithm>是所有STL頭文件中最大的一個(盡管它很好理解),它是由一大堆模版函數(shù)組成的,可以認為每個函數(shù)在很大程度上都是獨立的,其中常用到的功能范圍涉及到比較、交換、查找、遍歷操作、復(fù)制、修改、移除、反轉(zhuǎn)、排序、合并等等。<numeric>體積很小,只包括幾個在序列上面進行簡單數(shù)學(xué)運算的模板函數(shù),包括加法和乘法在序列上的一些操作。<functional>中則定義了一些模板類,用以聲明函數(shù)對象。2.1.2STL容器在實際的開發(fā)過程中,數(shù)據(jù)結(jié)構(gòu)本身的重要性不會遜色于操作于數(shù)據(jù)結(jié)構(gòu)的算法的重要性,當程序中存在著對時間要求很高的部分時,數(shù)據(jù)結(jié)構(gòu)的選擇就顯得更加重要。經(jīng)典的數(shù)據(jù)結(jié)構(gòu)數(shù)量有限,但是我們常常重復(fù)著一些為了實現(xiàn)向量、鏈表等結(jié)構(gòu)而編寫的代碼,這些代碼都十分相似,只是為了適應(yīng)不同數(shù)據(jù)的變化而在細節(jié)上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重復(fù)利用已有的實現(xiàn)構(gòu)造自己的特定類型下的數(shù)據(jù)結(jié)構(gòu),通過設(shè)置一些模版類,STL容器對最常用的數(shù)據(jù)結(jié)構(gòu)提供了支持,這些模板的參數(shù)允許我們指定容器中元素的數(shù)據(jù)類型,可以將我們許多重復(fù)而乏味的工作簡化。容器部分主要由頭文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。容器和相應(yīng)頭文件的對應(yīng)關(guān)系如表2-1。數(shù)據(jù)結(jié)構(gòu)描述實現(xiàn)頭文件向量(vector)連續(xù)存儲的元素<vector>列表(list)由節(jié)點組成的雙向鏈表,每個結(jié)點包含著一個元素<list>雙隊列(deque)連續(xù)存儲的指向不同元素的指針所組成的數(shù)組<deque>集合(set)由節(jié)點組成的紅黑樹,每個節(jié)點都包含著一個元素,節(jié)點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序<set>多重集合(multiset)允許存在兩個次序相等的元素的集合<set>棧(stack)后進先出的值的排列<stack>隊列(queue)先進先出的執(zhí)的排列<queue>優(yōu)先隊列(priority_queue)元素的次序是由作用于所存儲的值對上的某種謂詞決定的的一種隊列<queue>映射(map)由{鍵,值}對組成的集合,以某種作用于鍵對上的謂詞排列<map>多重映射(multimap)允許鍵對有相等的次序的映射<map>表2-1容器和相應(yīng)頭文件的對應(yīng)關(guān)系表2.1.3STL迭代器迭代器從作用上來說是最基本的部分。軟件設(shè)計有一個基本原則,所有的問題都可以通過引進一個間接層來簡化,這種簡化在STL中就是用迭代器來完成的。概括來說,迭代器在STL中用來將算法和容器聯(lián)系起來,起著一種黏和劑的作用。幾乎STL提供的所有算法都是通過迭代器存取元素序列進行工作的,每一個容器都定義了其本身所專有的迭代器,用以存取容器中的元素。迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,<iterator>中提供了迭代器使用的許多方法,而對于<memory>的描述則十分的困難,它以不同尋常的方式為容器中的元素分配存儲空間,同時也為某些算法執(zhí)行期間產(chǎn)生的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產(chǎn)生所有容器中的默認分配器。2.2BOOST簡介[3]Boost一套開放源代碼、高度可移植的C++庫。出自于C++標準委員會庫工作組。它的功能如下:正則表達式,可以與POSIXAPI和Perl語言處理正則表達式的功能相媲美,而且還能支持各種字符類型(如char、wchar_t,甚至還可以是自定義字符類型);多線程,可實現(xiàn)跨平臺的多線程庫;數(shù)據(jù)結(jié)構(gòu)方面除了STL中的數(shù)據(jù)結(jié)構(gòu)再加上即將加入標準的hash_set、hash_map、hash_multiset、hash_multimap等,使C++對數(shù)據(jù)結(jié)構(gòu)的支持已近完備;python,對Python語言的支持;智能指針,與std::auto_ptr一起善加使用,可杜絕內(nèi)存泄露;更有循環(huán)冗余的CRC、可輕松定義返回多個值函數(shù)的元組tuple、可容納不同類型值的any、對標準庫各方面的補充;還在迅速擴大中,部分內(nèi)容有望進入C++標準庫。第3章科學(xué)數(shù)據(jù)可視化的概述湖南師范大學(xué)本科畢業(yè)論文科學(xué)數(shù)據(jù)可視化的概述3.1科學(xué)數(shù)據(jù)可視化的基本概念3.1.1科學(xué)數(shù)據(jù)中國工程院院士、我國著名農(nóng)業(yè)與資源環(huán)境信息工程專家孫九林院士對科學(xué)數(shù)據(jù)的定義如下:“科學(xué)數(shù)據(jù)資源,是人類長期以來智慧的結(jié)晶、是信息與知識創(chuàng)新的源泉、提高人們生活質(zhì)量的保證、推動社會發(fā)展的重要條件;然而,只有對它實現(xiàn)有效的開發(fā)、管理、利用,建立起完善的共享、服務(wù)機制,充分發(fā)揮科學(xué)數(shù)據(jù)的科學(xué)價值、經(jīng)濟價值和社會價值,才能確保科技的‘第一生產(chǎn)力’地位。”[4]3.1.2可視化可視化是幫助人們表現(xiàn)數(shù)據(jù)或挖掘數(shù)據(jù)隱含信息的手段,目的是輔助人們得出某種結(jié)論性觀點。因此,可視化技術(shù)通常用在解決問題的后期階段,并且需要以數(shù)據(jù)采集和處理技術(shù)為基礎(chǔ)。沒有采集技術(shù),可視化技術(shù)就無從談起;沒有可視化技術(shù),采集來的數(shù)據(jù)得不到很好的應(yīng)用,它們是相輔相成的。3.1.3科學(xué)數(shù)據(jù)可視化的原理概述科學(xué)數(shù)據(jù)可視化是指運用計算機圖形學(xué)和圖像處理技術(shù)將科學(xué)計算過程中產(chǎn)生的數(shù)據(jù)和計算結(jié)果轉(zhuǎn)換為圖形或圖像在屏幕上顯示出來,并進行交互處理的理論、方法和技術(shù)。其研究的核心問題是將數(shù)據(jù)變成圖像,使繁多枯燥的科學(xué)數(shù)據(jù)變得更加直觀,易于理解。由于從事科學(xué)數(shù)據(jù)可視化研究的一般需要高性能計算機、高檔工作站、高速網(wǎng)絡(luò)和虛擬現(xiàn)實環(huán)境,這些都需要巨額的投資,而作為一般單位很難具備這樣的條件,因此從事這一研究的單位寥寥無幾,所以感覺科學(xué)數(shù)據(jù)可視化離我們比較遠。不過,科學(xué)數(shù)據(jù)可視化的運用對我們并不陌生,氣象預(yù)報中的衛(wèi)星云圖的變換就是我們經(jīng)常可以看到的科學(xué)數(shù)據(jù)可視化的例子。從事科學(xué)數(shù)據(jù)可視化的研究最主要是從事可視化處理的研究。可視化處理的研究就是包括對將科學(xué)數(shù)據(jù)轉(zhuǎn)化成為二維、三維的圖形或圖像信息,并可以人為對其進行加工以滿足人的視覺心理或應(yīng)用需求的行為??茖W(xué)數(shù)據(jù)可視化就是利用數(shù)字計算機或其他數(shù)字硬件,對從數(shù)據(jù)信息進行采集經(jīng)過數(shù)據(jù)可視化處理轉(zhuǎn)換而得的圖形、圖像將其在顯示設(shè)備上顯示。這樣可以幫助技術(shù)人員形象直觀地查看仿真結(jié)果,而且在一定程度上可以提高設(shè)計水平,減少錯誤的發(fā)生。因此計算機圖形技術(shù)將在各行業(yè)、各個領(lǐng)域內(nèi)得到越來越廣泛地應(yīng)用??茖W(xué)數(shù)據(jù)可視化的原理如圖3-1所示:圖3-1科學(xué)數(shù)據(jù)可視化原理圖3.2科學(xué)數(shù)據(jù)可視化的表示模型在進行具體科學(xué)數(shù)據(jù)可視化的開發(fā)之前,首先對科學(xué)數(shù)據(jù)可視化的表示模型是十分必要的,它可以幫助我們建立起正確的數(shù)據(jù)可視化的概念,這樣才能正確地進行開發(fā)研究;否則就會走彎路,甚至事倍功半??茖W(xué)數(shù)據(jù)可視化的表示模型可以分為三個部分,如圖3-2所示。圖3-2科學(xué)數(shù)據(jù)可視化的表示模型其中,科學(xué)數(shù)據(jù)是科學(xué)數(shù)據(jù)可視化的基礎(chǔ),有了科學(xué)數(shù)據(jù)才能確定坐標軸模型的顯示范圍,也才能確定圖形、圖像是顯示一什么樣的東西,是一個點、一條直線、一個平面圖形圖像還是一個三維圖形圖像。當科學(xué)數(shù)據(jù)模型和坐標軸模型都確定之后,這樣圖形圖像的位置也將可以確定下來。3.2.1科學(xué)數(shù)據(jù)模型科學(xué)數(shù)據(jù)模型定義某學(xué)科的科學(xué)數(shù)據(jù)及其它們之間的關(guān)系,并通過一種通用語言和一個信息的公共結(jié)構(gòu),為科學(xué)數(shù)據(jù)理解提供一個公共的基礎(chǔ),以便描述所采集的數(shù)據(jù),用于計算機系統(tǒng)的開發(fā),定義數(shù)據(jù)庫和進行數(shù)據(jù)轉(zhuǎn)換。因此,科學(xué)數(shù)據(jù)模型由相應(yīng)學(xué)科的要素(實體)和這些要素的特征(屬性)組成,并用E-R圖來描述數(shù)據(jù)模型的實體關(guān)系。如面向GIS地學(xué)的科學(xué)數(shù)據(jù)模型是由地學(xué)要素實體和點、線、面三個實體綜合表示地學(xué)空間的模型。它可以用圖層和相應(yīng)的屬性描述,層是用以區(qū)分空間實體的類別,即屬性一致的地理實體或特征相同的地理因子在空間分布的集合,目的是為了制圖、顯示、管理和分析。3.2.2坐標軸模型由于要使用二維的屏幕來描述二維或三維的圖形、圖像,這時可以利用坐標軸模型來實現(xiàn)在二維的屏幕上實現(xiàn)三維交互。簡單地說只要可以準確的確定從邏輯坐標值到設(shè)備坐標值的轉(zhuǎn)換方式,就可以實現(xiàn)在二維的屏幕上實現(xiàn)三維交互。如果需要表示一個二維圖形時,就構(gòu)造一個二維坐標軸,如圖3-3所示。圖3-3二維坐標模型如果需要表示一個三維圖形、圖像時,就構(gòu)造一個三維坐標軸,如圖3-4所示。圖3-4三維坐標模型隨著坐標軸的各個軸的單位量的參數(shù)的變化坐標軸能表現(xiàn)的圖形圖像也就可以隨之變化,如整個坐標軸的移動、坐標軸軸距的變換等。3.2.3圖形圖像模型圖形圖像模型是科學(xué)數(shù)據(jù)可視化的最高層。它是用于來表現(xiàn)科學(xué)數(shù)據(jù)的特征、用來描述科學(xué)數(shù)據(jù)之間的關(guān)系、用來對科學(xué)數(shù)據(jù)進行整理、用來發(fā)現(xiàn)科學(xué)數(shù)據(jù)的規(guī)律等。圖形圖像模型與坐標軸模型相結(jié)合可以構(gòu)成可視化平臺。在可視化平臺上可以進行多種變換操作這樣就能夠得到操作者所需要的圖形圖像。如改變坐標值的位置,圖形圖像也隨之改變,這樣可以切換用戶視角;改變坐標值的軸距,圖形圖像就隨之拉伸、縮放,這樣就實現(xiàn)了圖形圖像的放大和縮小等。3.3科學(xué)數(shù)據(jù)可視化的發(fā)展趨勢科學(xué)數(shù)據(jù)對我們的科學(xué)研究工作有很大的輔助作用。現(xiàn)在的科學(xué)計算的數(shù)據(jù)量可謂是呈幾何級數(shù)增長,如果沒有科學(xué)數(shù)據(jù)可視化技術(shù),人們很難從一大堆枯燥乏味的數(shù)字中找出其內(nèi)在規(guī)律和變化趨勢??茖W(xué)數(shù)據(jù)可視化在現(xiàn)實生活中的應(yīng)用領(lǐng)域更是舉足輕重,直接關(guān)系到國計民生。例如在核武器研究領(lǐng)域,我國已經(jīng)加入了核禁試條約,不能再做物理的原子彈爆炸實驗了,但是有關(guān)核彈的研究與制造工作還得進行,這就需要在計算機上進行數(shù)學(xué)模擬,并用科學(xué)數(shù)據(jù)可視化技術(shù)顯示其結(jié)果。此外還有石油勘探領(lǐng)域,通過科學(xué)計算可視化技術(shù)可以依據(jù)勘探的數(shù)據(jù)繪制出地下的石油分布圖。在氣象預(yù)報領(lǐng)域,科學(xué)計算可視化能在繁多的數(shù)據(jù)中總結(jié)出風(fēng)云變幻的趨勢。其次,采用科學(xué)數(shù)據(jù)可視化技術(shù)進行模擬實驗可以節(jié)省大量經(jīng)費。例如空氣動力學(xué)的有些實驗需要造一個巨大的風(fēng)洞,風(fēng)洞開動起來的時候,整個城市的電力都得供給它做物理實驗,而在計算機上采用科學(xué)數(shù)據(jù)可視化技術(shù)就可以對空氣動力學(xué)進行模擬;在飛機、輪船制造業(yè)中要求飛機輪船外形的阻力要小,如果是做實際模型,阻力大時就要對模型進行改動,需要耗費大量的經(jīng)費,而在計算機上則可以輕而易舉地實現(xiàn)。第三,在教育領(lǐng)域使用科學(xué)數(shù)據(jù)可視化技術(shù)可以使教學(xué)更直觀、更生動、更利于學(xué)生理解。例如醫(yī)學(xué)院學(xué)生學(xué)習(xí)解剖,就可以在計算機上做模擬手術(shù)。由此可見科學(xué)數(shù)據(jù)可視化的重要性。[5]第4章科學(xué)數(shù)據(jù)可視化的設(shè)計與實現(xiàn)湖南師范大學(xué)本科畢業(yè)論文科學(xué)數(shù)據(jù)可視化總體的設(shè)計科學(xué)數(shù)據(jù)可視化軟件需要快速的顯示圖形,進行大量的科學(xué)計算所以對代碼的執(zhí)行效率的要求比較高,在開發(fā)過程中我采用VC++這個高效的開發(fā)工具進行開發(fā),并采用C++語言STL中提供的多項數(shù)據(jù)結(jié)構(gòu),同時還運用了BOOST庫、PGL庫、GUILIB庫用來實現(xiàn)垃圾自動回收、高效的圖形顯示和精美的用戶操作界面??茖W(xué)數(shù)據(jù)可視化的總體流程圖如圖4-1圖4-1系統(tǒng)整體流程圖4.1科學(xué)數(shù)據(jù)可視化的類包設(shè)計由于科學(xué)數(shù)據(jù)可視化屬于一個比較大的系統(tǒng),在開發(fā)系統(tǒng)時,將系統(tǒng)按照功能分為五個小系統(tǒng)。除最后一個演示子系統(tǒng)生成EXE可執(zhí)行文件外,其它子系統(tǒng)都生成一個動態(tài)鏈接庫DLL文件,使之確保程序的可重用性。下面簡要的介紹科學(xué)數(shù)據(jù)可視化系統(tǒng)的五大類包:=1\*GB3①在屏幕上快速顯示圖形對象的類包。該類包封裝了GDI+,具有強大的圖形顯示和圖形導(dǎo)出功能。②由科學(xué)數(shù)據(jù)轉(zhuǎn)化成圖形對象的類包。該類包封裝了大量的數(shù)組、向量的數(shù)據(jù)結(jié)構(gòu),還包含了許多如顯示區(qū)域、坐標軸、曲線的等多種類。③支持MFC的圖形對象顯示類包。為了能充分發(fā)揮VC++的性能,更好的美化科學(xué)數(shù)據(jù)可視化操作界面,用桌面運用程序的式樣來演示科學(xué)數(shù)據(jù)可視化。用科學(xué)數(shù)據(jù)可視化的數(shù)據(jù)封裝在派生的MFC庫類中,派生出一套MFC類使之支持科學(xué)數(shù)據(jù)可視化。具體的派生圖請參見圖4-2圖4-2MFC派生圖=4\*GB3④圖形界面類包。用于開發(fā)出類似于VS.net的界面。=5\*GB3⑤科學(xué)數(shù)據(jù)可視化的演示類包。用來演示系統(tǒng)功能的類包。=1\*GB3①、②和③大類包是在PGL庫的基礎(chǔ)上進行二次開發(fā),使其功能更加強大和穩(wěn)定。4.2科學(xué)數(shù)據(jù)可視化設(shè)計中使用的數(shù)據(jù)結(jié)構(gòu)在科學(xué)數(shù)據(jù)可視化的設(shè)計中除了使用到了一些基本的數(shù)據(jù)結(jié)構(gòu)還大量動用了一些比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。如引用C++STL中的Vector、Map等;BOOST中的Shared_ptr等;4.2.1Vector結(jié)構(gòu)由于考慮到在設(shè)計時將會運用大量的矩陣信息,并且信息量不是唯一的而是不斷變化的,如一條曲線的有若干個點構(gòu)成,又如一個二維的平面中又有若干條曲線構(gòu)成,所以就必須采用動態(tài)的數(shù)據(jù)結(jié)構(gòu)。所以采用Vector結(jié)構(gòu)是十分合理的。在本論文第2章中提到Vector是C++STL中容器的一個數(shù)據(jù)結(jié)構(gòu),它與數(shù)組有很多相似的之處,但是數(shù)組只能保存固定大小的列表,而向量數(shù)據(jù)類型則提供了一種與“動態(tài)數(shù)組”相近的概念。從另一個角度來看它是一個模板類,用于管理任意類型的對象的動態(tài)數(shù)組,在解構(gòu)時釋放所管理的動態(tài)內(nèi)存,可以用于代替手工動態(tài)數(shù)組管理。Vector的操作方法:它的實現(xiàn)頭文件為:<Vector>=1\*GB3①添加元素voidpush_back(Tconst&t);voidinsert(iteratorpos,Tconst&t=T());voidinsert(iteratorpos,size_tn,Tconst&t);template<typenameIter>voidinsert(iteratorpos,Iterfirst,Iterlast);push_back()是把一個元素添加到vector的末尾。insert()是把一個t,或n個t,或從first開始到last結(jié)束的一個序列插入到pos指示的位置之前。當插入元素后size()將會大于capacity()時,將引起自動存儲分配。vector將會分配一個比需要的存儲區(qū)大若干倍(通常是1.5到2)的新的存儲區(qū),把老的元素拷貝過去,同時完成添加或插入,然后釋放老的存儲區(qū)。這就是說,vector自動存儲分配的空間大小是指數(shù)式增長的,這可以保證多次添加元素到vector中時,平均用時是接近于常數(shù)的。②刪除元素voiderase(iterator);voiderase(iteratorfirst,iteratorlast);voidpop_back();voidclear();這些函數(shù)分別刪除一個,一串,最后一個,或全部元素。③訪問元素以下成員函數(shù)/運算符用于訪問vector中的一個元素:T&at(size_tn);Tconst&at(size_tn)const;T&operator[](size_tn);Tconst&operator[](size_tn)const;T&front();Tconst&front()const;T&back();Tconst&back()const;由于vector是一個“值”語義的對象,所有的操作函數(shù)都必須嚴格保證const的正確性。所以,所有的元素訪問方法都有const和非const兩個版本。4.2.2Shared_ptr結(jié)構(gòu)由于在科學(xué)數(shù)據(jù)可視化時需要同時許多數(shù)據(jù)進行處理,而且有時由于視角的變化,圖形、圖像對象經(jīng)常需要創(chuàng)建和消亡,而且每一個對象所占用的存儲空間比較大,如果不及時處理將會使內(nèi)存崩潰,所以必須要對消亡的對象所占用的存儲空間進行回收。這個時候如果能采用垃圾自動回收機制則是最理想的解決方案。Boost庫中提供的Shared_ptr結(jié)構(gòu)可實現(xiàn)垃圾自動回收功能。Shared_ptr是一個智能指針,它采用的是“引用計數(shù)”(referencecounting)的原理,實現(xiàn)為每個對象保存指向它的指針數(shù)量,一旦這個數(shù)量降為0,就將這個對象釋放,意在用于對被指向?qū)ο蟮乃袡?quán)進行共享。Shared_ptr符合C++標準庫的“可復(fù)制構(gòu)造”(CopyConstructible)和“可賦值”(Assignable)要求,所以可被用于標準的庫容器中。第5章科學(xué)數(shù)據(jù)可視化的主要類及算法描述湖南師范大學(xué)本科畢業(yè)論文第5章科學(xué)數(shù)據(jù)可視化的主要類及算法描述在各個子系統(tǒng)的開發(fā)過程中,嚴格遵守軟件工程學(xué)理論和面向?qū)ο?OO)式程序設(shè)計規(guī)則,選用可視化程度較高的MicosoftVisualC++6.0編程語言具體實施。整個系統(tǒng)由各個相對獨立的封裝相關(guān)數(shù)據(jù)結(jié)構(gòu)及相應(yīng)實現(xiàn)方法的類組成。主要類的繼承關(guān)系請參見圖5-1圖5-1科學(xué)數(shù)據(jù)可視化的主要類的繼承關(guān)系圖5.1CPGLRegion類:這個類是科學(xué)數(shù)據(jù)可視化的圖形對象顯示區(qū)域類,它在整個軟件中有相當重要的地位。它的設(shè)計思想是:=1\*GB3①可以用它來獲取區(qū)域中的所有對象;=2\*GB3②在顯示區(qū)域中添加或刪除子區(qū)域;=3\*GB3③在顯示區(qū)域中實現(xiàn)一個二維坐標軸;=4\*GB3④使顯示區(qū)域可以實現(xiàn)更新操作;=5\*GB3⑤使顯示區(qū)域放大、縮小、可以恢復(fù)區(qū)域并且可以進行移動;⑥使顯示區(qū)域可以添加、刪除圖形對象;。這個是有由PGL圖形庫所提供的,并加以了二次開發(fā)。使之功能更大強大和完善。CPGLRegion的實現(xiàn)過程如下:實現(xiàn)=1\*GB3①的算法為:在CPGLRegion加入mObjects的成員變量,設(shè)置它的類型為一個新的對象管理類CPGLObjectManager并為每一個對象設(shè)定一個唯一的ID。CPGLObjectManager的實質(zhì)上是封裝了C++STL中的std::list<Object>和BOOST的shared_ptr<Object>可以實現(xiàn)STL的容器功能和當對象刪除時自動垃圾回收。加入一個對象:直接使用STL中Vector.push_back(pObject);刪除一個對象:if(!pObject) return;在容器中進行查找對象IDContainer::iteratorit; it=std::find(m_objects.begin(),m_objects.end(),pObject);if(it!=m_objects.end()) { 對象刪除 m_objects.erase(it);}查詢一個對象:Container::const_iteratorit; for(it=m_objects.begin();it!=m_objects.end();++it) { //testingifobject.ID==uID if((*it)->CheckID(uID)) returntrue; }returnfalse; 使用上述功能即可實現(xiàn)對對象的管理功能; 實現(xiàn)=2\*GB3②和實現(xiàn)=1\*GB3①的算法的十分相似; 實現(xiàn)=3\*GB3③是主要算法是構(gòu)造一個二維坐標軸變量m_axe,在構(gòu)造Region之時就構(gòu)造它。當Region把所有圖形對象都加入進來時,這時調(diào)用GetUnionExtent成員函數(shù)得到Region的最大范圍rExtent,rExtent中有兩組值(x,y)左上角的點,(x1,y1)右上角的點。GetUnionExtent是將每一個對象的最大范圍進行比較得到一個最大的。把rExtent來定義二維坐標軸的表示數(shù)據(jù)區(qū)域即可。 實現(xiàn)=4\*GB3④的算法用一個布爾型變量m_bNeedUpdate來判斷是事需要刷新Region區(qū)域。在需要刷新時調(diào)用PlotGfx成員函數(shù)即可。 實現(xiàn)=5\*GB3⑤的算法是首先對需要對坐標軸進行縮放,然后對View進行縮放。如果采用選定區(qū)域進行放大,首先對鼠標采樣的兩個點進行比較,按順序進行排列并調(diào)用PixelToWorldCoord成員函數(shù)實現(xiàn)視圖坐標向邏輯坐標轉(zhuǎn)換。將得到的坐標來實現(xiàn)對坐標軸已及對View進行縮放。 視圖坐標向邏輯坐標轉(zhuǎn)換的算法如下: iaxe為0是對X軸,為1是Y軸 switch(iaxe) { case0: ASSERT(m_iWidth>0); returnm_dLeft+(pix-m_iTx)*(m_dRight-m_dLeft)/m_iWidth; break; case1: ASSERT(m_iHeight>0); returnm_dTop-pix*(m_dTop-m_dBottom)/m_iHeight; break; default: return0; }實現(xiàn)⑥和實現(xiàn)=1\*GB3①和實現(xiàn)=2\*GB3②的算法差不多,將對象加入STL的list或者是從list中刪除。CPGLRegion作為科學(xué)數(shù)據(jù)可視化的核心類,在應(yīng)用科學(xué)數(shù)據(jù)可視化時首先應(yīng)生成Region對象,并在里面添加科學(xué)數(shù)據(jù)生成的圖形對象,能過添加坐標軸和視圖類可科學(xué)數(shù)據(jù)圖形對象加以顯示,最終形成可視化區(qū)域。通過CPGLRegion類還可以得到Region中的任何一個圖形對象,并可以對圖形對象的屬性進行設(shè)置,以及放大、縮小等操作。5.2CPGLObject類:CPGLObject類一個圖形對象的類。它可以是一個點、一條線、一個坐標軸還可以是一個說明性文字等。它的設(shè)計思想是:=1\*GB3①可以用它設(shè)置對象的名稱和標識(ID);=2\*GB3②可以用它來設(shè)置對象的顏色、顯示方式以及透明度;=3\*GB3③獲取圖形對象的最大寬度和長度;=4\*GB3④獲取圖形對象的是否有填充;CPGLRegion的實現(xiàn)過程如下: 成員變量: 實現(xiàn)=1\*GB3①的算法為:在CPGLObject加入Cstring類型的m_sName的成員變量和繼承一個自動管理ID的類CPGLNode,這樣可以通過m_sName在來設(shè)置對象的名稱,通過CPGLNode提供的成員函數(shù)GetID來設(shè)置對象ID。設(shè)置對象的ID也是通過STL的Container來實現(xiàn)的。首先獲得的Region中的CPGLObjectManager的對象list就可以得到list的大小,根據(jù)其大小值,如果它為0則自動生成一個ID,此ID為數(shù)據(jù)型;如果大小值不為0同,則在大小值上使用替增序列可以設(shè)置一個獨一無二的ID。 實現(xiàn)了ID就可以標識,就可以實現(xiàn)對Region進行操作時根據(jù)對象ID對單個對象進行操作。 實現(xiàn)=2\*GB3②的算法是加入幾個成員變量對來實現(xiàn)對象的屬性操作,如:加入一個CPGLColor類型m_cColor的成員變量用來設(shè)置對象的顏色和透明度。CPGLColor類中將RGB顏色和透明度用一個一維數(shù)據(jù)豐裝起來。這在一次操作中就可以實現(xiàn)對顏色和透明度的設(shè)置;在該類中還使用枚舉型定了多種顏色,這樣就可以方便顏色的使用。為了能設(shè)置對象的顯示方式在類中加入了gfxinterface::ELayerm_eLayer;和boolm_bVisible;的變量。前者用于設(shè)置圖形對象的顯示層數(shù),在顯示圖形對象時跟據(jù)層數(shù)的顯示圖形的位置;后者用于設(shè)置圖形對象是隱藏還是顯示。在設(shè)置對象屬性時,加入一個在這里采用STL中的pair和map的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)用字符串來設(shè)置顏色屬性,如設(shè)置顏色可以用SET(“COLOR=RED”)。具體實現(xiàn)如下:typedefstd::pair<int,CString>PropertyPair; typedefstd::map<CString,PropertyPair>PropertyMap; 將字符串的屬性設(shè)置轉(zhuǎn)換成枚舉的屬性值 switch(StringToObjectProp(szProp)) { caseObjectPropName: SetName(szValue); returntrue; caseObjectPropDescription: SetDescription(szValue); returntrue; caseObjectPropColor: 將字符串的屬性設(shè)置轉(zhuǎn)換成顏色的枚舉的屬性值 SetColor(CPGLColor::StringToColor(szValue)); returntrue; caseObjectPropBrush: 設(shè)置對象填充 ParseBrushFormat(szValue); returntrue; caseObjectPropVisible: Show((_tcsicmp(szValue,_T("on"))==0||_tcsicmp(szValue,_T("true"))==0)); returntrue; caseObjectPropLayer: if(_tcsicmp(szValue,_T("front"))==0) SetLayer(LayerFront); elseif(_tcsicmp(szValue,_T("back"))==0) SetLayer(LayerBack); elseif(_tcsicmp(szValue,_T("disable"))==0) SetLayer(LayerDisabled); returntrue; default: returnfalse; } 實現(xiàn)=3\*GB3③是主要算法是通過GetUnionExtent的成員函數(shù)來獲取對象的最大范圍。它是通過比較對象數(shù)據(jù)中的每一個值得到一個最大的值并存放在m_rExtent變量中。 實現(xiàn)=4\*GB3④的算法與實現(xiàn)=2\*GB3②的算法基本相同。用一個CPGLBrushPtr;型變量m_pBrushFill來填充對象。5.3CPGLAxe2D類:CPGLAxe2D類一個坐標軸類,用來在實現(xiàn)一個二維的坐標軸。它的設(shè)計思想是:=1\*GB3①坐標的軸X軸和Y軸可以表示全體實數(shù);=2\*GB3②坐標軸中可以繪制網(wǎng)格線;=3\*GB3③坐標軸的數(shù)值標注可以改變字體、顯示角度;=4\*GB3④坐標軸的軸距可以放大和縮??;CPGLAxe2D的實現(xiàn)過程如下:實現(xiàn)=1\*GB3①的算法是定義一個double型變量來表示坐標軸的數(shù)值標識。在C++double型變量是八個字節(jié),它表示的精度足以能夠表示坐標軸的需要的精度。實現(xiàn)=2\*GB3②的算法是根據(jù)坐標軸的步長來定,類定義了一個步長的變量。坐標軸的初始值(x,y)是由Region中的最大范圍rExtent變量的左上角點的x和右下角的y1來確定,這時初始還通過取整處理。每加一個步長時畫一條線,直到畫到rExtent右下角的x1和左上角的y即終值。步長的取法是通過終值與初值的差再除上一個整數(shù),再將其進行修正。通過初始值、步長和終值可以組成Vector向量組的坐標標注(數(shù)值型或日期型)。實現(xiàn)=3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北京市公安局輔警招聘245人考試備考題庫附答案
- 四川光明能源發(fā)展集團有限公司關(guān)于公開招聘見習(xí)生的考試備考題庫附答案
- 月湖區(qū)區(qū)屬事業(yè)單位公開選調(diào)工作人員【12人】考試備考題庫附答案
- 石棉縣人力資源和社會保障局關(guān)于2025年下半年面向縣內(nèi)公開考調(diào)事業(yè)單位工作人員的(7人)考試備考題庫附答案
- 2026年重慶公務(wù)員遴選筆試題庫附答案
- 2026甘肅蘭州中川機場招聘考試備考題庫附答案
- 2026年大學(xué)大二(護理學(xué))婦產(chǎn)科護理學(xué)階段綜合測試題及答案
- 2025國家電投集團中國電力招聘7人筆試參考題庫附帶答案詳解(3卷)
- 2025四川綿陽綿太實業(yè)有限公司招聘運營管理部副經(jīng)理崗位1人筆試參考題庫附帶答案詳解(3卷)
- 中信銀行2025年春季校園招聘全球統(tǒng)一考試筆試歷年典型考題及考點剖析附帶答案詳解
- 蕉嶺縣幅地質(zhì)圖說明書
- 地下車庫建筑結(jié)構(gòu)設(shè)計土木工程畢業(yè)設(shè)計
- 電梯控制系統(tǒng)論文
- (完整word版)人教版初中語文必背古詩詞(完整版)
- GB/T 2261.4-2003個人基本信息分類與代碼第4部分:從業(yè)狀況(個人身份)代碼
- GB/T 16601.1-2017激光器和激光相關(guān)設(shè)備激光損傷閾值測試方法第1部分:定義和總則
- PDM結(jié)構(gòu)設(shè)計操作指南v1
- 投資學(xué)-課件(全)
- 風(fēng)機及塔筒生產(chǎn)全流程檢驗分析課件(-47張)
- 幼兒園課件:大班語言古詩《梅花》精美
- GB∕T 2076-2021 切削刀具用可轉(zhuǎn)位刀片 型號表示規(guī)則
評論
0/150
提交評論