程 飛
(安徽電子信息職業(yè)技術學院 電子工程系,安徽 蚌埠 233000)
數(shù)字科技館益智類仿真模型設計關鍵技術研究
程 飛
(安徽電子信息職業(yè)技術學院 電子工程系,安徽 蚌埠 233000)
數(shù)學益智模型對于思維能力訓練具有重要作用。相對于實物模型,虛擬模型可以反映實物內(nèi)部形態(tài)和組合過程,能更好表達模型所包含的科學原理。采用一檔多視技術開發(fā)交互式仿真益智模型,結合OpenGL開發(fā)透明模型,采用VC++設計dlg對話框,可以實現(xiàn)仿真益智模型設計與開發(fā)。給出了以中國古代益智模型牟合方蓋為實例,結合上述關鍵技術設計和開發(fā)仿真益智模型的具體過程。
益智模型;虛擬仿真;OpenGL
數(shù)學益智游戲對于開發(fā)智力,培養(yǎng)空間想象力有重要作用??萍拣^里常見的牟合方蓋、魯班鎖、九連環(huán)都屬于此類。然而,這些模型都是以實體形式體現(xiàn)的。由于對此類模型的研究受到各種條件的限制,參觀者對于其內(nèi)部結構和反映的數(shù)學原理難以很好理解,模型的科普意義有限。目前對于益智游戲的研究主要集中在實物設計研究[1],或者僅限于利用靜態(tài)模型研究科學原理[2],對于交互式虛擬數(shù)學益智游戲研究主要集中在平面游戲[3],關于三維交互式虛擬數(shù)學益智游戲未見相關文獻。如果能夠開發(fā)三維虛擬模型,其科普作用可以不受時間地點的限制,學習者通過觀察和交互式虛擬研究,可以更好理解其中包含的數(shù)學原理。對于數(shù)字科技館的建設也有重要意義。因而,有必要對于虛擬數(shù)學益智游戲的設計和開發(fā)進行研究。本文以牟合方蓋為例,詳述虛擬數(shù)學益智游戲的設計和開發(fā)過程。
對一個正立方體從縱橫兩側面作內(nèi)切圓柱體時,兩圓柱體的公共部分稱為“牟合方蓋”[4](如圖1、圖2所示)。正立方體以內(nèi),牟合方蓋以外的部分稱為“外棋”。為了簡化問題,一般研究八分之一牟合方蓋(位于第一卦限的部分)。
圖1 牟合方蓋的形成
圖2 牟合方蓋
牟合方蓋的作用是在應用祖暅原理推算球的體積時作為中間模型,對于計算球的體積有重要意義。其計算原理是:計算等高的牟合方蓋的切片面積和方錐的切片面積,推導出外棋體積與方錐體積相同,則牟合方蓋的體積等于方蓋所在立方體體積減去外棋體積(即方錐體積)。再次利用祖暅原理,利用方蓋和球體的等高切片面積的對應關系,得到球體積(如圖10所示)。相關計算詳見有關資料[4],不再贅述。祖暅原理、牟合方蓋、球體積公式三者層次關系如圖3所示:
圖3 牟合方蓋作用
(1)祖暅原理
計算球體積必須用到祖暅原理(祖暅原理的意義是:如果兩個等高的立體在等高處截二立體的面積恒等,則這兩個物體的體積相等)。因而,首先開發(fā)祖暅原理交互式軟件。這里采用VC++和OpenGL開發(fā)。VC++的MFC負責交互式界面的設計[5],而OpenGL負責圖形顯示[6]。
圖4 祖暅原理交互界面
開發(fā)步驟為:
首先建立MFC文件,然后切分界面,左邊放入表單視(FormView),右邊放入視圖類(View),關鍵語句如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{CRect rect;
GetWindowRect(&rect);
BOOL bRes=m_wndSplitter.CreateStatic(this,1,2);//切分成1行兩列
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(jiaohuqu),CSize(0,0),pContext); //左邊放入FormView
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(hutuqu),CSize(0,0),pContext);//右邊放入視圖類(View)
…………………………………………}
左邊交互區(qū)輸入數(shù)值(形變參數(shù)),通過UpdateData(TRUE)實現(xiàn)控件值進變量。左邊“確定”按鈕按下,左右界面之間通過一檔多視技術開始通訊,向所有視圖發(fā)送lHint,并從FormView向Doc傳遞中間值,View區(qū)讀取Doc中的變量值,按變量值繪制圖形。關鍵代碼如下:
void CKuangjiaView::OnButton1()
{jiaohuquDoc*pDoc=(jiaohuqu *)GetDocument();
int ptt(1); //設置lHint=1
pDoc->doccanshu=m_canshu;//參數(shù)進Doc文檔相應變量
pDoc->UpdateAllViews(NULL, 1,(CObject*)&ptt);//通知所有View
…………………………}
View區(qū)獲取Doc中的變形系數(shù)以后,即繪制彎曲的圓柱體,這里將圓柱體理解為多個(這里取100個)小圓柱體的疊加,每個小圓柱體依次在y軸方向移動一個距離s(由s =t2, t∈[0,1]給定),就可以實現(xiàn)彎曲效果。進一步繪制兩個圓形切片,以表示等高處截面。繪制效果如圖4所示。
(2)牟合方蓋
先繪制立方體,由于電腦顯示設置的不同,需要調整分割線以實現(xiàn)正方體顯示效果。和上面的技術相同,通過按鈕響應繪制縱橫兩個方向的圓柱。如圖5和圖6所示。
圖5 橫向圓柱
圖6 兩個方向的圓柱
為簡化問題,僅以八分之一牟合方蓋為例進行繪制。此時有三個外棋,如圖7所示。每個外棋均理解為曲邊棱錐,通過下面的方法繪制棱錐:首先計算縱橫兩個方向的圓柱的相貫線。相貫線[7]的表達式由曲面方程聯(lián)立表示為:
(1)
為簡化計算,僅取位于第一卦限的八分之一牟合方蓋,取xi =i*r/100, (i=0,1,……,100),代入上式,計算得到y(tǒng)i,zi,將點的數(shù)據(jù)賦給數(shù)組x[i],y[i],z[i],得到相貫線的數(shù)據(jù)。同樣的方法可以獲得其他交線的點數(shù)據(jù)。利用獲得的數(shù)據(jù),可以利用小四邊形面片繪制出曲面,進一步由多個曲面圍成立體。以左下角的形體為例,其上曲面繪制關鍵代碼如下:
for(int i=0; i<100; i++)
{ glBegin(GL_QUADS);
glNormal3f(x[i],y[i],z[i]);
glVertex3f(r, y[i],z[i]);
glVertex3f(r,x[i+1],z[i+1]);
glVertex3f(x[i+1],x[i+1],z[i+1]);
glEnd();}
圖7 八分之一牟合方蓋和外棋
圖8 主控界面
(3)主界面設計
基于DLL設計主界面,和前面同樣的方法,通過按鈕外部啟動《祖暅原理》,《牟合方蓋》,以及《球體積》計算模塊。主界面將三者結合成一個整體。關鍵代碼如下:
ShellExecute(this->m_hWnd,"open","datazugengyuanli.exe","","",SW_SHOW );
繪制效果如圖8所示。
3.1 透明
在圖形學中,透明通過公式s=sf*α+sp*(1-α)實現(xiàn),其中sf為前景圖,sp為背景圖,α為混合算子,關鍵語句為:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// GL_SRC_ALPHA為混合算子α,GL_ONE_MINUS_SRC_ALPHA為1-α
在OpenGL環(huán)境下[7-8],繪制圓柱要分前后兩個部分繪制,才能顯示效果。繪制牟合方蓋和外棋要用不同的顏色表示面。
3.2 原理展示
原理涉及到較為復雜的數(shù)學表達式,因而直接通過按鈕啟動dlg,以對話框顯示原理。關鍵代碼為 void CKuangjiaView::OnButton4()
{………………;
yuanli dlg;
dlg.DoModal();}
球體積計算的原理和計算方法用dlg顯示的結果如圖9和圖10所示。
圖9 算法原理對話框
圖10 計算過程對話框
3.3 爆炸圖[9]
爆炸圖可以幫助學習者理解內(nèi)部結構以及牟合方蓋的形成過程。圖7即為響應“移出外棋”按鈕對應的爆炸圖。每次按下按鈕,通過lHint傳值,改變外棋繪圖的原點,實現(xiàn)外棋平移。Z方向平移的關鍵代碼如下:
glPushMatrix();//壓棧
glTranslatef(0,0,t);//每次按下按鈕,t增加1(t+=1);
waiqi();//繪制外棋
glPopMatrix();//出棧
目前,比較常用的數(shù)學實物模型,虛擬仿真模型方式可以更好表達相關數(shù)學原理。學習者可以利用參數(shù)化三維虛擬數(shù)學模型,進行交互式自主學習,可以深入了解相關知識。該方法不僅可以應用于數(shù)學益智類仿真設計,也可以推廣到教學領域,開發(fā)教學輔助資源,如應用于圓周率推導、算籌運算等數(shù)學內(nèi)容。此外,該方法的關鍵技術可以應用于數(shù)字科技館開發(fā),如在中國古代數(shù)字科技館的建設中,利用透明技術表現(xiàn)指南車等古代機械的工作原理。采用一檔多視技術開發(fā)交互式仿真益智模型,結合OpenGL開發(fā)透明模型,采用VC++設計dlg對話框,是實現(xiàn)仿真益智模型設計與開發(fā)的一種行之有效的方法。
[1] 李凌云.益智游戲與課程的融合[J].讀寫算,2014(22): 207.
[2] 張東海.牟合方蓋曲面的參數(shù)方程及其在GeoGebra中的應用[J].中學數(shù)學月刊,2015(6): 48-50.
[3] 范智軒,胡娜,楊文陽.Flash益智游戲的設計與開發(fā)研究[J].數(shù)字技術與應用,2013(4): 184-186.
[4] 王樹禾.數(shù)學演義(普及版)[M].北京:科學出版社,2004.
[5] 鄭阿奇,丁有和. Visual C++教程(第2版)[M]. 北京:清華大學出版社,2009.
[6] 李勝睿.計算機圖形學實驗教程[M].北京:機械工業(yè)出版社,2004.
[7] 程飛.基于OpenGL的高等數(shù)學多媒體課件實現(xiàn)[J].洛陽師范學院學報,2005(10):72-74.
[8] 于曉明,孔耀美.基于OpenGL的反走樣算法的分析與應用[J].咸陽師范學院學報,2016(2): 60-64.
[9] 王幼龍. 機械制圖[M].北京:機械工業(yè)出版社,2006.
(責任編輯:孫文彬)
Research on the Key Technology of Simulation Design of Puzzle Game Model in Digital Museum
CHENG Fei
(Department of Electronic Engineering, Anhui Vocational College of Electronics & Information Technology, Bengbu Anhui 233000, China)
Mathematica puzzle game was significant to thinking ability training. Compared with natural pattern, simulation model could reflect the internal form and combination process, and better express the scientific principles of the model as well. Using a multi view technology to develop interactive simulation puzzle model, combined with the OpenGL to develop transparent model, using VC++ to design the dlg dialog box, the design and development of simulation puzzle model could be realized. Combined with the key technology as above, the specific process of design and development of the simulation model of the China ancient educational model Steinmetz solid was given as an example.
puzzle game model;simulation;OpenGL
2016-12-15
安徽省教育廳2013年自然科學研究項目(KJ2013Z013)。
程飛(1970-),男,江蘇江都人,副教授,碩士,主要從事CAD及計算機仿真研究。
TP311.1
A
1009-7961(2017)01-0034-04