計算機圖形學(xué)專業(yè)課程設(shè)計圖形繪制變換_第1頁
計算機圖形學(xué)專業(yè)課程設(shè)計圖形繪制變換_第2頁
計算機圖形學(xué)專業(yè)課程設(shè)計圖形繪制變換_第3頁
計算機圖形學(xué)專業(yè)課程設(shè)計圖形繪制變換_第4頁
計算機圖形學(xué)專業(yè)課程設(shè)計圖形繪制變換_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

計算機圖形學(xué)實驗報告課程名稱:計算機圖形學(xué)實驗名稱:圖形繪制與變換學(xué)院:電子信息工程學(xué)院專業(yè):計算機科學(xué)與技術(shù)班級:11計科本01班學(xué)號:11110203姓名:張慧指引教師:王征風(fēng)二零一四年目錄TOC\o"1-3"\h\u7564一、引言 327339二、設(shè)計需求 487752.1設(shè)計目的 442472.2設(shè)計環(huán)境 4286882.2.1VC++6.0 4226172.2.2MFC 4147342.3設(shè)計題目及規(guī)定 5320522.4總體流程圖 57206三、課程設(shè)計原理 5252373.1實現(xiàn)算法 5170633.1.2Bresenham算法畫直線 6288673.1.3中心點算法畫圓和橢圓 65513.2圖形變換基本原理 899173.2.1平移變換 8273673.2.2旋轉(zhuǎn)變換 851403.2.3比例變換 921819四、總體設(shè)計與功能實現(xiàn) 9170734.1重要界面設(shè)計 9293784.2設(shè)立顏色界面 960484.2.1界面設(shè)立代碼 9282914.2.2運營成果 10110934.3二維線畫圖元實現(xiàn) 10150024.4畫多邊形功能實現(xiàn) 14238224.5畫Bezier曲線功能實現(xiàn) 15247284.6二維圖形變換實現(xiàn) 16169514.7三維圖形變換 18五、實驗心得體會一、引言計算機圖形學(xué)(ComputerGraphics,簡稱CG)是一種使用數(shù)學(xué)算法將二維或三維圖形轉(zhuǎn)化為計算機顯示屏柵格形式科學(xué)。簡樸地說,計算機圖形學(xué)重要研究內(nèi)容就是研究如何在計算機中表達圖形、以及運用計算機進行圖形計算、解決和顯示有關(guān)原理與算法。是計算機科學(xué)一種分支領(lǐng)域,重要關(guān)注數(shù)字合成與操作視覺圖形內(nèi)容。計算機圖形學(xué)研究是應(yīng)用計算機產(chǎn)生圖像所有工作,不論圖像是靜態(tài)還是動態(tài),可交互還是固定,等等。圖形API是容許程序員開發(fā)包括交互式計算機圖形操作應(yīng)用而不需要關(guān)注圖形操作細節(jié)或任務(wù)系統(tǒng)細節(jié)工具集。計算機圖形學(xué)有著廣泛應(yīng)用領(lǐng)域,涉及物理、航天、電影、電視、游戲、藝術(shù)、廣告、通信、天氣預(yù)報等幾乎所有領(lǐng)域都用到了計算機圖形學(xué)知識,這些領(lǐng)域通過計算機圖形學(xué)將幾何模型生成圖像,將問題可視化從而為各領(lǐng)域更好服務(wù)。

計算機圖形學(xué)運用計算機產(chǎn)生讓人賞心悅目視覺效果,必要建立描述圖形幾何模型尚有光照模型,再加上視角、顏色、紋理等屬性,再通過模型變換、視圖變換、投影操作等,這些環(huán)節(jié)從而實現(xiàn)一種完整OpenGL程序效果。OpenGL是一種開放三維圖形軟件包,它獨立于窗口系統(tǒng)和操作系統(tǒng),以它為基本開發(fā)應(yīng)用程序可以十分以便地在各種平臺間移植。計算機圖形學(xué)通過應(yīng)用OpenGL功能,使得生成圖形效果具備高度真實感。學(xué)習(xí)計算機圖形學(xué)重點是掌握OpenGL在圖形學(xué)程序中用法。

事實上,圖形學(xué)也把可以表達幾何場景曲線曲面造型技術(shù)和實體造型技術(shù)作為其重要研究內(nèi)容。同步,真實感圖形計算成果是以數(shù)字圖像方式提供,計算機圖形學(xué)也就和圖像解決有著密切關(guān)系。通過21世紀(jì)是信息時代,在日新月異科技更新中相信計算機會發(fā)揮越來越重要作用,計算機圖形學(xué)也會在更多領(lǐng)域所應(yīng)用,雖然國內(nèi)在這方面還比較薄弱,但相信會有越來越好時候。二、設(shè)計需求2.1設(shè)計目的以圖形學(xué)算法為目的,進一步研究。繼而策劃、設(shè)計并實現(xiàn)一種可以體現(xiàn)計算機圖形學(xué)算法原理或完整過程演示系統(tǒng),并能從某些方面作出評價和改進意見。通過完畢一種完整程序,經(jīng)歷策劃、設(shè)計、開發(fā)、測試、總結(jié)和驗收各階段,達到:鞏固和實踐計算機圖形學(xué)課程中理論和算法;學(xué)習(xí)體現(xiàn)計算機圖形學(xué)算法技巧;培養(yǎng)認真學(xué)習(xí)、積極摸索精神。2.2設(shè)計環(huán)境2.2.1VC++6.0VC++6.0是Microsoft公司推出一種基于Windows系統(tǒng)平臺、可視化集成開發(fā)環(huán)境,它源程序按C++語言規(guī)定編寫,并加入了微軟提供功能強大MFC(MicrosoftFoundationClass)類庫。MFC中封裝了大某些WindowsAPI函數(shù)和Windows控件,它包括功能涉及到整個Windows操作系統(tǒng)。MFC不但給顧客提供了Windows圖形環(huán)境下應(yīng)用程序框架,并且還提供了創(chuàng)立應(yīng)用程序組件,這樣,開發(fā)人員不必從頭設(shè)計創(chuàng)立和管理一種原則Windows應(yīng)用程序所需程序,而是從一種比較高起點編程,故節(jié)約了大量時間。另外,它提供了大量代碼,指引顧客編程時實現(xiàn)某些技術(shù)和功能。因而,使用VC++提供高度可視化應(yīng)用程序開發(fā)工具和MFC類庫,可使應(yīng)用程序開發(fā)變得簡樸。2.2.2MFCMFC(MicrosoftFoundationClasses),是一個微軟公司提供類庫(classlibraries)以C++類形式封裝了WindowsAPI,,它包括了窗口等許多類定義。各種類集合構(gòu)成了一種應(yīng)運程序框架構(gòu)造,以減少應(yīng)用程序開發(fā)人員工作量。其中包括類包括大量Windows句柄封裝類和諸多Windows內(nèi)建控件和組件封裝類。MFC6.0版本封裝了大概200個類,其中某些可以被顧客直接使用。例如CWnd類封裝了窗口功能,涉及打印文本、繪制圖形及跟蹤鼠標(biāo)指針移動等;CsplitterWnd類是從CWnd類派生出來,繼承了基類或稱父類CWnd類所有特性,但增長了自己功能,實現(xiàn)拆分窗口,使窗口至少可被拆提成兩個窗口,顧客可以移動兩個窗口之間邊框來變化窗口大??;CtoolBar類可以定義工具欄等。MFC命名慣例是類名字普通是由“C”打頭;成員變量使用前綴“m_”,接著使用一種字母來指明數(shù)據(jù)類型,然后是變量名稱;所有單詞用大寫字母開頭。2.3設(shè)計題目及規(guī)定題目:實現(xiàn)多邊形和曲線繪制和變換規(guī)定:學(xué)會使用VC++編寫實現(xiàn)圖形繪制變換,需涉及直線、曲線、多邊形繪制和變換,及三維立體圖形相應(yīng)變換.2.4總體流程圖三、課程設(shè)計原理3.1實現(xiàn)算法3.1.1DDA算法畫直線

DDA是數(shù)字微分分析式(DigitalDifferentialAnalyzer)縮寫。

已知直線兩端點(x1,y1)、(x2,y2)則斜率m為:m=(y2-y1)/(x2-x1)=Dx/Dy;直線中每一點坐標(biāo)都可以由前一點坐標(biāo)變化一種增量(Dx,Dy)而得到,即表達為遞歸式:xi+1=xi+Dxyi+1=yi+Dy。遞歸式初值為直線起點(x1,y1),這樣,就可以用加法來生成一條直線。詳細算法是:

該算法適合所有象限,其中用了用了兩個函數(shù)如:Integer(-8.5)=-9;Integer(8.5)=8;Sign(i),依照i正負,分別得到-1,0,+1;

相應(yīng)代碼://DDADrawLine

{if(abs(x2-x1)>abs(y2-y1))

length=abs(x2-x1);

else

length=abs(y2-y1);

Dx=(x2-x1)/length;

Dy=(y2-y1)/length;

x=x1+0.5*Sign(Dx);

y=x2+0.5*Sign(Dy);

i=1;

while(i<=lenght)

{setpixel(Integer(x),Integer(y),color);

x=x+Dx;

y=y+Dy;

i+=1;}}3.1.2Bresenham算法畫直線思路如下://假設(shè)該線段位于第一象限內(nèi)且斜率不不大于0不大于1,設(shè)起點為(x1,y1),終點為(x2,y2).//依照對稱性,可推導(dǎo)至全象限內(nèi)線段.1.畫起點(x1,y1).2.準(zhǔn)備畫下個點。x坐標(biāo)增1,判斷如果達到終點,則完畢。否則,由圖中可知,下個要畫點要么為當(dāng)前點右鄰接點,要么是當(dāng)前點右上鄰接點.如果線段ax+by+c=0與x=x1+1交點y坐標(biāo)不不大于M點y坐標(biāo)話,下個點為U(x1+1,y1+1),否則,下個點為B(x1+1,y1),3.畫點(U或者B).4.跳回第2步.5.結(jié)束.3.1.3中心點算法畫圓和橢圓(1)中心點算法畫圓在一種方向上取單位間隔,在另一種方向取值由兩種也許取值中點離圓遠近而定。實際解決中,用決策變量符號來擬定象素點選取,因而算法效率較高。生成圓弧中點算法和上面講到生成直線段中點算法類似??紤]第一象限內(nèi)八分之一圓弧段。通過計算,得出鑒別式遞推公式為:這兩個遞推公式初值條件為:編寫成員函數(shù)如下:voidCMy2_9View::MidPointEllipse(CDC*pDC,doublea,doubleb,intcolor){doublex,y,d,xP,yP,squarea,squareb;squarea=a*a;squareb=b*b;xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb)));yP=(int)(0.5+(double)squareb/sqrt((double)(squarea+squareb)));x=0;y=b;d=4*(squareb-squarea*b)+squarea;pDC->SetPixel(x,y,color);while(x<=xP){if(d<=0)d+=4*squareb*(2*x+3);else{d+=4*squareb*(2*x+3)-8*squarea*(y-1);y--;}x++;pDC->SetPixel(x,y,color);}x=a;y=0;d=4*(squarea-a*squareb)+squareb;pDC->SetPixel(x,y,color);while(y<yP){if(d<=0)d+=4*squarea*(2*y+3);else{d+=4*squarea*(2*y+3)-8*squareb*(x-1);x--;}y++;pDC->SetPixel(x,y,color);}}編寫OnDraw函數(shù)如下:voidCMy2_9View::OnDraw(CDC*pDC){CMy2_9Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); MidPointEllipse(pDC,500,300,RGB(0,0,0));}(2)中心點算法畫橢圓咱們先考慮圓心在原點橢圓生成,對于中心不是原點橢圓,可以通過坐標(biāo)平移變換獲得相應(yīng)位置橢圓。中心在原點。焦點在坐標(biāo)軸上原則橢圓具備X軸對稱、Y軸對稱和原點對稱特性,已知橢圓上第一象限P點坐標(biāo)是(x,y),則橢圓在此外三個象限對稱點分別是(x,-y)、(-x,y)和(-x,-y)。因而,只要畫出第一象限四分之一橢圓,就可以運用這三個對稱性得到整個橢圓。相應(yīng)代碼:voidMP_Ellipse(intxc,intyc,inta,intb){doublesqa=a*a;doublesqb=b*b;doubled=sqb+sqa*(-b+0.25);intx=0;inty=b;EllipsePlot(xc,yc,x,y);while(sqb*(x+1)<sqa*(y-0.5)){if(d<0){d+=sqb*(2*x+3);}else{d+=(sqb*(2*x+3)+sqa*(-2*y+2));y--;}x++;EllipsePlot(xc,yc,x,y);}d=(b*(x+0.5))*2+(a*(y-1))*2-(a*b)*2;while(y>0){if(d<0){d+=sqb*(2*x+2)+sqa*(-2*y+3);x++;}else{d+=sqa*(-2*y+3);}y--;EllipsePlot(xc,yc,x,y);}}3.2圖形變換基本原理3.2.1平移變換平移變換函數(shù)如下:voidglTranslate{fd}(TYPEx,TYPEy,TYPEz);三個函數(shù)參數(shù)就是目的分別沿三個軸向平移偏移量。這個函數(shù)表達用于這三個偏移量生成矩陣乘以當(dāng)前矩陣。當(dāng)參數(shù)是(0.0,0.0,0.0)時,表達對函數(shù)glTranslate*()操作是單位矩陣,也就是對物體沒有影響。3.2.2旋轉(zhuǎn)變換旋轉(zhuǎn)變換函數(shù)如下:VoidglRota{fd}TYPEangle,TYPEx,TYPEy,TYPEz);函數(shù)中第一種參數(shù)是表達目的沿從點(x,y,z)到原點方向逆時針旋轉(zhuǎn)角度,后三個參數(shù)是旋轉(zhuǎn)方向點坐標(biāo)。這個函數(shù)表達用這四個參數(shù)生成矩陣乘以當(dāng)前矩陣。當(dāng)角度參數(shù)是0.0時,表達對物體沒有影響。3.2.3比例變換比例變換函數(shù)如下:VoidglScale{fd}(TYPEx,TYPEy,TYPEz);單個函數(shù)參數(shù)值就是目的分別沿三個軸方向縮放比例因子。這個函數(shù)表達用這三個比例因子生成矩陣乘以當(dāng)前矩陣。這個函數(shù)能完畢沿相應(yīng)軸對目的進行拉伸、壓縮和反射三項功能。以參數(shù)x為例,若當(dāng)x不不大于1.0時,表達沿x方向拉伸目的;若x不大于1.0,表達沿x軸方向收縮目的;若x=-1.0表達沿x軸反射目的。其中參數(shù)為負值時表達對目的進行相應(yīng)軸反射變換。四、總體設(shè)計與功能實現(xiàn)4.1重要界面設(shè)計4.2設(shè)立顏色界面4.2.1界面設(shè)立代碼:voidCGraphicsView::OnClock(){ WHAT_TO_DO=ID_CLOCK;clean(); intxx=450,yy=300,r=150,d=5; inti,white=RGB(255,255,255); mile(xx,yy,r,COLOR); Matrixm(xx,240),s(xx,200); Matrixt1(xx,yy,true),t2(-xx,-yy,true),mr(PI/1800),sr(PI/30); mile(m.getx(),m.gety(),d+1,COLOR); mile(s.getx(),s.gety(),d,COLOR); dne(m.getx(),m.gety(),xx,yy,COLOR); dne(s.getx(),s.gety(),xx,yy,COLOR); for(i=0;i<120;i++){ ::Sleep(80); mile(m.getx(),m.gety(),d+1,white); mile(s.getx(),s.gety(),d,white); dne(m.getx(),m.gety(),xx,yy,white); dne(s.getx(),s.gety(),xx,yy,white); m=t1*mr*t2*m; s=t1*sr*t2*s; mile(m.getx(),m.gety(),d+1,COLOR); mile(s.getx(),s.gety(),d,COLOR); dne(m.getx(),m.gety(),xx,yy,COLOR); dne(s.getx(),s.gety(),xx,yy,COLOR);}}4.2.2點擊“設(shè)立--顏色”后,運營成果如下:4.3二維線畫圖元實現(xiàn)4.3.1實當(dāng)代碼:voidCGraphicsView::MidCir(CDC*pdc,intx0,inty0,intx1,inty1,intcolor){ intr,x,y,deltax,deltay,d; r=sqrt(((double)x1-(double)x0)*((double)x1-(double)x0)+((double)y1-(double)y0)*((double)y1-(double)y0)); x=0; y=r; deltax=3; deltay=2-r-r; d=1-r; while(x<=y) { ::Sleep(time); pdc->SetPixel(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixel(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixel(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixel(-x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixel(y+x0,x+y0,color); ::Sleep(time); pdc->SetPixel(-y+x0,x+y0,color); ::Sleep(time); pdc->SetPixel(y+x0,-x+y0,color); ::Sleep(time); pdc->SetPixel(-y+x0,-x+y0,color); if(d<0) { d+=deltax; deltax+=2; x++;} else { d+=deltax+deltay; deltax+=2; deltay+=2; x++; y--; }}}voidCGraphicsView::midellispse(intxx,intyy,intr1,intr2,intcolor){ }voidCGraphicsView::Ellipse(CDC*pdc,intx1,inty1,intx2,inty2,intcolor){xx0=(x2+x1)/2; yy0=(y2+y1)/2; rra=abs(x2-x1)/2; rrb=abs(y2-y1)/2; if(rra==0&&rrb==0)return; Ellipse0(pdc,xx0,yy0,rra,rrb,color);}voidCGraphicsView::Ellipse0(CDC*pdc,intx0,inty0,inta,intb,intcolor){inti,yy; intx,y,deltax,deltay; intaa,aa2,aa3,bb,bb2,bb3; doubled1,d2; aa=a*a; aa2=aa*2; aa3=aa*3; bb=b*b; bb2=bb*2; bb3=bb*3; x=0; y=b; d1=bb+aa*(-b+0.25); deltax=bb3; deltay=-aa2*b+aa2; pdc->SetPixelV(x+x0,y+y0,color); pdc->SetPixelV(x+x0,-y+y0,color); while(bb*(x+1)<aa*(y-0.5)) { yy=y; if(d1<0) { d1+=deltax; deltax+=bb2; x++;} else { d1+=deltax+deltay; deltax+=bb2; deltay+=aa2; x++; y--;} ::Sleep(time); pdc->SetPixelV(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,-y+y0,color);} d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb; deltax-=bb; deltay+=aa; while(y>0) { if(d2<0) { d2+=deltax+deltay; deltax+=bb2; deltay+=aa2; x++; y--; } else { d2+=deltay; deltay+=aa2; y--; } ::Sleep(time); pdc->SetPixelV(x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,y+y0,color); ::Sleep(time); pdc->SetPixelV(x+x0,-y+y0,color); ::Sleep(time); pdc->SetPixelV(-x+x0,-y+y0,color); }}voidCGraphicsView::DDALine(CDC*pdc,intx0,inty0,intx1,inty1,intcolor){ intxx,yy,s,s1,s2,di; floatdx,dy,k,x,y; dx=x1-x0; if(dx>=0)s1=1; else s1=-1; dy=y1-y0; if(dy>=0)s2=1; else s2=-1; dx=abs(dx); dy=abs(dy); if(dx>=dy) {s=0; di=(int)dx; k=dy/dx*s2;} else { s=1; di=(int)dy; k=dx/dy*s1;} x=x0; y=y0; for(inti=0;i<=di;i++) {if(s==0) {xx=(int)x; yy=(int)(y+0.5); ::Sleep(time); pdc->SetPixel(xx,yy,color); x+=s1; y+=k;} else{ xx=(int)(x+0.5); yy=(int)y; ::Sleep(time); pdc->SetPixel(xx,yy,color); y+=s2; x+=k;}}}4.3.2點擊二維線畫圖元,課相應(yīng)畫出直線、圓和橢圓,成果如下:4.4畫多邊形功能實現(xiàn)4.4.1某些實當(dāng)代碼:voidCGraphicsView::OnDrawDuoBX(){ Vertex_Countdlg; if(dlg.DoModal()==IDOK) { if(dlg.m_vertex_count>MAX) { MessageBox("輸入頂點數(shù)過大"); return; } VertexTotal=dlg.m_vertex_count; CDC*pDC=GetDC(); CPenpen(PS_SOLID,2,RGB(255,255,255)); CPen*pOldpen=pDC->SelectObject(&pen); pDC->MoveTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5)); inti; for(i=1;i<inLength;i++) pDC->LineTo((int)(inVertexArray[i].x+0.5),(int)(inVertexArray[i].y+0.5)); pDC->LineTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5)); pDC->SelectObject(pOldpen); ReleaseDC(pDC); inLength=0; outLength=0; WHAT_TO_DO=ID_DrawDuoBX;}}4.4.2點擊多邊形,輸入定點個數(shù),可繪制出相應(yīng)多邊形,成果如下:4.5畫Bezier曲線功能實現(xiàn)4.5.1某些實當(dāng)代碼:voidCGraphicsView::OnBezier(){ //TODO:Addyourcommandhandlercodehere WHAT_TO_DO=ID_BEZIER; CDC*p=GetDC(); p->TextOut(10,20,"PS:鼠標(biāo)左鍵添加曲線,鼠標(biāo)右鍵修改曲線."); ReleaseDC(p);}voidCGraphicsView::OnBezierClear(){ n=-1; RedrawWindow();}voidCGraphicsView::DrawBezier(DPOINT*p){ if(n<=0)return; if((p[n].x<p[0].x+1)&&(p[n].x>p[0].x-1)&&(p[n].y<p[0].y+1)&&(p[n].y>p[0].y-1)) { pDC->SetPixel(p[0].x,p[0].y,COLOR); return; } DPOINT*p1; p1=newDPOINT[n+1]; inti,j; p1[0]=p[0]; for(i=1;i<=n;i++) { for(j=0;j<=n-i;j++) { p[j].x=(p[j].x+p[j+1].x)/2; p[j].y=(p[j].y+p[j+1].y)/2; } p1[i]=p[0];} DrawBezier(p); DrawBezier(p1); deletep1;}voidCGraphicsView::OnBezierAdd(){ AddorMove=1; }voidCGraphicsView::OnBezierMove(){ AddorMove=-1;}voidCGraphicsView::OnMouseMove(UINTnFlags,CPointpoint){ switch(WHAT_TO_DO) { caseID_BEZIER: { if(current>=0) { points[current].x=point.x; points[current].y=point.y; RedrawWindow();} if(current2>=0) { points[current2].x=point.x; points[current2].y=point.y; RedrawWindow();} break; } default:break;} CView::OnMouseMove(nFlags,point);}4.5.2點擊曲線--Beizer曲線,可實現(xiàn)Beizer曲線繪制功能,繪制成果如下圖:圖1圖24.5.3點擊曲線--Beizer曲線,可實現(xiàn)Beizer曲線移動,鼠標(biāo)點擊其中任一點,可實現(xiàn)曲線移動,繪制成果如下圖:上圖1移動后曲線上圖2移動后曲線4.6二維圖形變換實現(xiàn)可以實現(xiàn)一橢圓在界面上隨機移動,一圓在界面上饒某一點旋轉(zhuǎn)和一正方形由大變小在變大變化,某些實當(dāng)代碼如下:voidCGraphicsView::OnXuanzhuan(){ WHAT_TO_DO=ID_XUANZHUAN; time=0; OnClear(); CClientDCdc(this); CDC*pDC=&dc; inti,white=RGB(255,255,255),point[2][2]={{300,200},{300,250}}; Matrixa(point[0][0],point[0][1]),b(point[1][0],point[1][1]); intmidx=(point[0][0]+point[1][0])/2,midy=(point[0][1]+point[1][1])/2; Matrixt1(midx,midy,true),t2(-midx,-midy,true); Matrixr(PI/50); Matrixtemp(midx,midy,true); temp=t1*r*t2; for(i=0;i<200;i++){ ::Sleep(50); MidCir(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; MidCir(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); } for(i=0;i<200;i++){ ::Sleep(50); MidCir(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; MidCir(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); } time=5;}voidCGraphicsView::OnUpdateXuanzhuan(CCmdUI*pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_XUANZHUAN);}voidCGraphicsView::OnScale(){ WHAT_TO_DO=ID_SCALE; OnClear(); CClientDCdc(this); CDC*pDC=&dc; time=0; inti,white=RGB(255,255,255),point[4][2]={{300,250},{400,250},{300,300},{400,300}}; floatsx=0.9,sy=0.85; intmidx=(point[0][0]+point[3][0])/2,midy=(point[0][1]+point[3][1])/2; Matrixs1(sx,sy),s2(1/sx,1/sy); Matrixt1(midx,midy,true),t2(-midx,-midy,true); Matrixa(point[0][0],point[0][1]),b(point[1][0],point[1][1]); Matrixc(point[2][0],point[2][1]),d(point[3][0],point[3][1]); Matrixtemp(midx,midy,true); temp=t1*s1*t2; DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR); for(i=0;i<20;i++){ ::Sleep(30); DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; c=temp*c; d=temp*d; DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR);} temp=t1*s2*t2; for(i=0;i<20;i++){ ::Sleep(30); DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),white); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),white); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),white); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),white); a=temp*a; b=temp*b; c=temp*c; d=temp*d; DDALine(pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR); DDALine(pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR); DDALine(pDC,c.getx(),c.gety(),d.getx(),d.gety(),COLOR); DDALine(pDC,d.getx(),d.gety(),b.getx(),b.gety(),COLOR); } time=5;}voidCGraphicsView::OnUpdateScale(CCmdUI*pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_SCALE);}4.7三維圖形變換重要實現(xiàn)三維圖形上下左右平移,分別繞X軸Y軸Z軸旋轉(zhuǎn),放大和縮小,以及正方體六個面顏色變換,除此之外,還可以選取背景顏色變化4.7.1某些代碼如下:voidCGraphicsView::OnAoduomianti(){ WHAT_TO_DO=ID_AODUOMIANTI; CDrawDLGdlg1; dlg1.DoModal();}voidCGraphicsView::OnUpdateAoduomianti(CCmdUI*pCmdUI){ pCmdUI->SetCheck(WHAT_TO_DO==ID_AODUOMIANTI);}voidCDrawDLG::OnPaint(){ CPaintDCdc(this);//devicecontextforpainting CWnd*pWnd=GetDlgItem(IDC_DRAW); pWnd->UpdateWindow();// CDC*PDC=pWnd->GetDC(); Draw();}voidCDrawDLG::Draw(){ CWnd*pWnd=GetDlgItem(IDC_DRAW); pWnd->UpdateWindow(); CDC*pDC=pWnd->GetDC(); CRectrect; pWnd->GetClientRect(rect); Dv[8]={ {-fs,-fs,fs},{-fs,fs,fs},{fs,fs,fs},{fs,-fs,fs},{-fs,-fs,-fs},{-fs,fs,-fs},{fs,fs,-fs},{fs,-fs,-fs} },d[8]; POINTp0[4],p1[4],p2[4],p3[4],p4[4],p5[4],w[8]; intz[8]; for(inti=0;i<8;i++) { d[i].x=v[i].x; d[i].y=(int)(v[i].y*cos(a*DU)-v[i].z*sin(a*DU)); d[i].z=(int)(v[i].y*sin(a*DU)+v[i].z*cos(a*DU)); v[i].x=(int)(d[i].x*cos(b*DU)+d[i].z*sin(b*DU)); v[i].y=d[i].y; v[i].z=(int)(d[i].z*cos(b*DU)-d[i].x*sin(b*DU)); d[i].x=(int)(v[i].x*cos(c*DU)-v[i].y*sin(c*DU)); d[i].y=(int)(v[i].x*sin(c*DU)+v[i].y*cos(c*DU)); d[i].z=v[i].z; w[i].x=d[i].x+cx; w[i].y=d[i].y+cy; z[i]=d[i].z;} p0[0]=w[0];p0[1]=w[1];p0[2]=w[2];p0[3]=w[3]; p1[0]=w[4];p1[1]=w[5];p1[2]=w[6];p1[3]=w[7];p2[0]=w[0];p2[1]=w[1];p2[2]=w[5];p2[3]=w[4]; p3[0]=w[1];p3[1]=w[2];p3[2]=w[6];p3[3]=w[5]; p4[0]=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6]; p5[0]=w[0];p5[1]=w[3];p5[2]=w[7];p5[3]=w[4]; switch(Maxnum(z,7)) { case0:fill(p0,p2,p5,0,2,5);break; case1:fill(p0,p2,p3,0,2,3);break; case2:fill(p0,p3,p4,0,3,4);break; case3:fill(p0,p4,p5,0,4,5);break; case4:fill(p1,p2,p5,1,2,5);break; case5:fill(p1,p2,p3,1,2,3);break; case6:fill(p1,p3,p4,1,3,4);break; case7:fill(p1,p4,p5,1,4,5);break;}}BOOLCDrawDLG::OnInitDialog(){ CDialog::OnInitDialog(); m_scroll1.SetScrollRange(-180,180); m_scroll1.SetScrollPos(0); m_scroll2.SetScrollRange(-180,180); m_scroll2.SetScrollPos(0); m_scroll3.SetScrollRange(-180,180); m_scroll3.SetScrollPos(0); m_scroll4.SetScrollRange(0,350); m_scroll4.SetScrollPos(200); m_scroll5.SetScrollRange(0,300); m_scroll5.SetScrollPos(115); m_scroll6.SetScrollRange(0.00,300.00); m_scroll6.SetScrollPos(50.00); a=b=c=0; fs=50.00; SetTimer(1,100,NULL); Ctrl=0; cx=200; cy=115; COLOR1=RGB(123,234,43); COLOR2=RGB(123,123,0); COLOR3=RGB(123,24,235); COLOR4=RGB(0,123,95); COLOR5=RGB(23,234,34); COLOR6=RGB(234,124,0); COLOR7=RGB(0,43,98); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCDrawDLG::OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar){ intnID=pScrollBar->GetDlgCtrlID(); switch(nID) { caseIDC_SCROLLBAR1:a=pScrollBar->GetScrollPos(); switch(nSBCode) { caseSB_LINELEFT:a--;break; caseSB_LINERIGHT:a++;break; caseSB_PAGELEFT:a-=10;break; caseSB_PAGERIGHT:a+=10;break; caseSB_THUMBTRACK:a=nPos;break;} if(a<-180)a=180; if(a>180)a=-180; pScrollBar->SetScrollPos(a); break; caseIDC_SCROLLBAR2:b=pScrollBar->GetScrollPos(); switch(nSBCode) { caseSB_LINELEFT:b--;break; caseSB_LINERIGHT:b++;break; caseSB_PAGELEFT:b-=10;break; caseSB_PAGERIGHT:b+=10;break; caseSB_THUMBTRACK:b=nPos;break;} if(b<-180)b=180; if(b>180)b=-180; pScrollBar->SetScrollPos(b); break; caseIDC_SCROLLBAR3:c=pScrollBar->GetScrollPos(); switch(nSBCode) { caseSB_LINELEFT:c--;break; caseSB_LINERIGHT:c++;break; caseSB_PAGELEFT:c-=10;break; caseSB_PAGERIGHT:c+=10;break; caseSB_THUMBTRACK:c=nPos;break;} if(c<-180)c=180; if(c>180)c=-180; pScrollBar->SetScrollPos(c); break; caseIDC_SCROLLBAR4:cx=pScrollBar->GetScrollPos(); switch(nSBCode) { caseSB_LINELEFT:cx--;break; caseSB_LINERIGHT:cx++;break; caseSB_PAGELEFT:cx-=10;break; caseSB_PAGERIGHT:cx+=10;break; caseSB_THUMBTRACK:cx=nPos;break;} if(cx<0)cx=200; if(cx>350)cx=200; pScrollBar->SetScrollPos(cx); break; caseIDC_SCROLLBAR5:cy=pScrollBar->GetScrollPos(); switch(nSBCode) { caseSB_LINELEFT:cy--;break; caseSB_LINERIGHT:cy++;break; caseSB_PAGELEFT:cy-=10;break; caseSB_PAGERIGHT:cy+=10;break; caseSB_THUMBTRACK:cy=nPos;break;} if(cy<0)cy=300; if(cy>300)cy=0; pScrollBar->SetScrollPos(cy); break; caseIDC_SCROLLBAR6:fs=pScrollBar->GetScrollPos(); switch(nSBCode) { caseSB_LINELEFT:fs--;break; caseSB_LINERIGHT:fs++;break; caseSB_PAGELEFT:fs-=0.55;break; caseSB_PAGERIG

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論