陳 進(jìn)
(安徽電子信息職業(yè)技術(shù)學(xué)院 信息與智能工程系,安徽 蚌埠 233000)
“基礎(chǔ)化學(xué)”課程是高職化工、醫(yī)療等專業(yè)的核心課程,其地位十分重要.該課程對于學(xué)生思維水平有一定的要求,同時(shí)與高中課程聯(lián)系較為緊密.對于基礎(chǔ)較為薄弱,知識(shí)結(jié)構(gòu)有欠缺的高職學(xué)生來說,學(xué)習(xí)難度較大.對于教師的教學(xué)也具有一定的挑戰(zhàn)性.以“氫原子的波函數(shù)”一節(jié)為例.其涉及到原子物理學(xué)、概率論、球面極坐標(biāo)方程、指數(shù)函數(shù)等內(nèi)容,是后續(xù)教學(xué)內(nèi)容“原子的電子組態(tài)”的基礎(chǔ),對于沒有這方面物理和數(shù)學(xué)基礎(chǔ)的高職學(xué)生,在規(guī)定的教學(xué)時(shí)間內(nèi)完成教學(xué)任務(wù)十分困難.例如,對于氫原子軌道的角度分布圖(Y函數(shù)),以及電子云的角度分布圖(Y2函數(shù)),課本一般僅僅給出截面圖,學(xué)生難以理解[1].而教學(xué)中常用方法是使用塑料模型作為輔助教學(xué)手段,或者通過PPT靜態(tài)展示Y函數(shù),以及Y2函數(shù)的立體圖.雖然能起到一定的輔助教學(xué)作用,但是對于“節(jié)面”等概念,以及對于Y函數(shù)和Y2函數(shù)的差別分析,學(xué)生仍然難以理解.而如果采用計(jì)算機(jī)圖形學(xué)技術(shù)手段,開發(fā)出相關(guān)微課件,將Y函數(shù)及Y2函數(shù)圖像用計(jì)算機(jī)實(shí)現(xiàn),并應(yīng)用圖形交互技術(shù)實(shí)現(xiàn)必要的人機(jī)對話,就可以從任意給定的視角精確觀察函數(shù)圖像,即使對于物理和數(shù)學(xué)基礎(chǔ)較差的學(xué)生,也能實(shí)現(xiàn)對于教學(xué)內(nèi)容有較為深刻的理解.
目前,有多種計(jì)算機(jī)圖形學(xué)方法開發(fā)微課件.既可以采用大型和專業(yè)圖形軟件,也可以直接采用底層圖形庫.底層圖形庫約束少,直接面向編程語言,具有更大的適應(yīng)性,可以開發(fā)出特殊需求的微課件.例如,基于OpenGL(SGI公司發(fā)布的底層圖形庫)設(shè)計(jì)的微課件,體積小,能集中體現(xiàn)微課件的特點(diǎn);而且程序易于修改,容易實(shí)現(xiàn)軟件復(fù)用.OpenGL在計(jì)算機(jī)輔助教學(xué)領(lǐng)域有廣泛的應(yīng)用,可以開發(fā)出有交互功能的輔助教學(xué)系統(tǒng)和教學(xué)微課件[2],其教學(xué)效果明顯優(yōu)于靜態(tài)展示型課件(如AuthorWare以及PPT等).實(shí)踐表明,OpenGL是實(shí)現(xiàn)微課件設(shè)計(jì)的有效工具.OpenGL內(nèi)容很多,掌握起來有一定難度,但是,對于微課件開發(fā)而言,只要建立起來圖形框架,在掌握了OpenGL的線、面畫法,以及光照模型之后,只需要很少的編程語言(如VC++)基礎(chǔ)知識(shí)和數(shù)學(xué)知識(shí),就可以開發(fā)微課件了.本文以上述“氫原子的波函數(shù)”一節(jié)中的Ydz2軌道的角度分布圖,以及電子云的角度分布圖的教學(xué)為例,對這一問題進(jìn)行研究.
(1)球面坐標(biāo).如圖1所示,球面極坐標(biāo)系中一點(diǎn)P(x,y,z)用(r,θ,φ)表示,而OpenGL繪圖環(huán)境是空間直角坐標(biāo)系.空間一點(diǎn)P的直角坐標(biāo)與極坐標(biāo)的關(guān)系有下式表達(dá):
(1)
其中,極徑r及θ角與φ角的意義如圖1所示.
圖1 球面坐標(biāo)
圖2 表面點(diǎn)的法向量計(jì)算
(2)
其中ax,ay,az和bx,by,bz分別為矢量a,b的x,y,z分量.
Ydz2軌道的極坐標(biāo)方程由下式給出[1],
(3)
因而Ydz2軌道的參數(shù)方程為:
(4)
(1)算法設(shè)計(jì).OpenGL采用SetTimer(1,n,NULL)函數(shù)建立系統(tǒng)時(shí)鐘,每n毫秒激發(fā)一次WM_TIMER事件,InvalidateRect()使窗口無效,強(qiáng)迫系統(tǒng)發(fā)出WM_PAINT消息,在該消息中調(diào)用繪圖函數(shù)(用戶自定義,如DrawScene()函數(shù)),即每n毫秒重繪一次圖形.OpenGL環(huán)境下繪制三維物體[3],可以首先定義一個(gè)三維數(shù)組,存放三維圖形表面點(diǎn)的直角坐標(biāo)數(shù)據(jù);為了繪制具有真實(shí)感的圖形,還要再定義一個(gè)數(shù)組存放每個(gè)點(diǎn)的法向量.為了避免每次重繪時(shí)將所有數(shù)據(jù)重新計(jì)算一遍,可以在繪圖函數(shù)DrawScene()外定義一個(gè)計(jì)算數(shù)組的函數(shù),同時(shí)在繪圖函數(shù)DrawScene()中設(shè)置一個(gè)bool型向量“panduan”,僅當(dāng)puanduan=0時(shí)執(zhí)行數(shù)組計(jì)算,計(jì)算完成后置為1.每次重繪就不再重新進(jìn)行數(shù)據(jù)計(jì)算,這樣可以有效提高繪圖速度,節(jié)約時(shí)間開銷.
(2)算法實(shí)現(xiàn).該算法的具體步驟如下:
①定義表面點(diǎn)數(shù)據(jù)數(shù)組float shuju[101][101][3]分別存放表面點(diǎn)的x,y,z坐標(biāo);定義法向量數(shù)組float faxian[101][101][3];
②定義計(jì)算表面點(diǎn)數(shù)據(jù)的函數(shù)void biaomiandianshuju(){}.由于θ角在[0,2π]間取值,φ角在[0,2π]間取值.將θ角在[0,2π]間均分n份,將φ角在[0,2π]間均分為n份,由式(4)求出表面點(diǎn)P(i,j)(i,j=1,2,……,n)的三維坐標(biāo)(這里n取100),存入數(shù)組float shuju[101][101][3].計(jì)算表面點(diǎn)數(shù)據(jù)的函數(shù)的具體代碼如下:
void biaomiandianshuju()//計(jì)算表面點(diǎn)P(i,j)的坐標(biāo)
{for(i=0;i<=100;i++)
{for(int j=0;j<=100;j++)
{shuju [i][j][0]=r1205*sin(j*6.28/100)*cos(i*6.28/100)*0.3
*(3*cos(j*6.28/100)*cos(j*6.28/100)-1);//計(jì)算表面點(diǎn)P(i,j)的x坐標(biāo)
shuju [i][j][1]=r1205*sin(j*6.28/100)*sin(i*6.28/100)
*0.3*(3*cos(j*6.28/100)*cos(j*6.28/100)-1);//計(jì)算表面點(diǎn)P(i,j)的y坐標(biāo)
shuju [i][j][2]=r1205*cos(j*6.28/100)*0.3
*(3*cos(j*6.28/100)*cos(j*6.28/100)-1);//計(jì)算表面點(diǎn)P(i,j)的z坐標(biāo)}}}
③再定義計(jì)算法向量數(shù)據(jù)的函數(shù)void法向量(){},利用三維坐標(biāo)數(shù)據(jù)shuju[101][101][3]由式(2)計(jì)算法線數(shù)據(jù),存入法向量數(shù)組faxian[101][101][3].計(jì)算法向量數(shù)據(jù)的函數(shù)的具體代碼如下:
void biaomiandianshuju()//計(jì)算表面點(diǎn)P(i,j)的點(diǎn)法線
{for(i=0;i<100;i++)
{for(int j=0;j<100;j++){
floatai1j1jianij11=shuju[i][j+1][0]-shuju[i][j][0];//矢量α的x分量
floatai1j1jianij12=shuju[i][j+1][1]-shuju[i][j][1];//矢量α的y分量
floatai1j1jianij13=shuju[i][j+1][2]-shuju[i][j][2];//矢量α的z分量
floatbi1j1jianij11=shuju[i+1][j][0]-shuju[i][j][0];//矢量b的x分量
floatbi1j1jianij12=shuju[i+1][j][1]-shuju[i][j][1];//矢量b的y分量
floatbi1j1jianij13=shuju[i+1][j][2]-shuju[i][j][2];//矢量b的z分量
faxian[i][j][0]=ai1j1jianij12*bi1j1jianij13-ai1j1jianij13*bi1j1jianij12;
//表面點(diǎn)P(i,j)的法向量的x分量
faxian[i][j][1]=ai1j1jianij13*bi1j1jianij11-ai1j1jianij11*bi1j1jianij13;
//表面點(diǎn)P(i,j)的法向量的y分量
faxian[i][j][2]=ai1j1jianij11*bi1j1jianij12-ai1j1jianij12*bi1j1jianij11;}
//表面點(diǎn)P(i,j)的法向量的z分量}}
④相鄰3點(diǎn)作三角形,應(yīng)用法向量繪制光照效果.部分代碼如下:
for(i=0;i<100;i++)
{for(int j=0;j<100;j++){
glBegin(GL_QUADS);
glNormal3f(faxian[i][j][0],faxian[i][j][1],faxian[i][j][2]);
glVertex3f(ll[i][j][0],ll[i][j][1],ll[i][j][2]);
glNormal3f(faxian[i][j+1][0],faxian[i][j+1][1],faxian[i][j+1][2]);
glVertex3f(ll[i][j+1][0],ll[i][j+1][1],ll[i][j+1][2]);
glEnd();}}
(3)圖形交互.為了深化對于教學(xué)內(nèi)容的理解,精確的可控制的多角度動(dòng)態(tài)觀察是必要的.OpenGL中,通過設(shè)定旋轉(zhuǎn)角度實(shí)現(xiàn)圖形的繞坐標(biāo)軸旋轉(zhuǎn),按下“←↑→↓”鍵,實(shí)現(xiàn)動(dòng)態(tài)觀察.這里設(shè)定每次按鍵旋轉(zhuǎn)5度.部分代碼如下:
case VK_UP://按下↑鍵
angle_X-=5;//繞X軸逆時(shí)針旋轉(zhuǎn)5度
case VK_LEFT://按下←鍵
angle_Z-=5;//繞Z軸順時(shí)針旋轉(zhuǎn)5度
以Ydx2-y2軌道的角度分布圖(如圖5所示)為例,圖6顯示繞z軸逆時(shí)針旋轉(zhuǎn)90度的Ydx2-y2的效果圖.
圖3 Ydz2軌道的角度分布圖(Y函數(shù))
圖4 Ydz2軌道電子云的角度分布圖(Y2函數(shù))
圖5 Ydx2-y2軌道的角度分布圖
圖6 繞z軸逆時(shí)針旋轉(zhuǎn)90度的Ydx2-y2
(4)繪制結(jié)果.圖3顯示了Ydz2軌道的角度分布圖(Y函數(shù)).可見Y沿z軸方向伸展,xy平面上還有一個(gè)較小的環(huán)形分布.
(5)代碼復(fù)用.基于OpenGL的微課件設(shè)計(jì),具有語言簡潔,易于修改的特點(diǎn).例如,將上述(3)式修改為
就可以得到Y(jié)dz2軌道電子云的角度分布圖(Y2函數(shù)),如圖4所示,比較圖3與圖4,可見Y2函數(shù)比Y函數(shù)“瘦”.需要注意的是,這里Y2表示空間不同方位角電子出現(xiàn)的概率密度變化情況,而不是概率密度與距離的關(guān)系,這一問題應(yīng)在教學(xué)中予以強(qiáng)調(diào).如果將程序略作修改,可以推廣到其他軌道.圖5顯示了Ydx2-y2軌道的角度分布圖,很容易分析出共有兩個(gè)節(jié)面,其方程為x+y=1,以及x+y=-1.
基于OpenGL設(shè)計(jì)的微課件,能夠直觀表達(dá)教學(xué)內(nèi)容.例如,教材上說明Y函數(shù)與Y2函數(shù)區(qū)別時(shí)候,一般僅繪出剖面圖,其教學(xué)效果明顯不如圖3和圖4分析直觀.基于OpenGL的設(shè)計(jì)的微課件能降低教材難度,例如,由于“節(jié)面”內(nèi)容解釋起來比較復(fù)雜,教材一般僅簡單敘述最為簡單的Ypx的節(jié)面,而如果參考圖5,很容易理解“節(jié)面”的概念.基于OpenGL設(shè)計(jì)的微課件,還具有體積小,交互能力強(qiáng),易于擴(kuò)充和修改,教學(xué)中易于使用等特點(diǎn),其圖形繪制能力甚至遠(yuǎn)勝于一些專業(yè)和大型圖形軟件.基于OpenGL的微課件設(shè)計(jì),能有效輔助教學(xué),是高職微課件設(shè)計(jì)的有效途徑.