計算機圖形學課程教學設計圖形繪制變換_第1頁
計算機圖形學課程教學設計圖形繪制變換_第2頁
計算機圖形學課程教學設計圖形繪制變換_第3頁
計算機圖形學課程教學設計圖形繪制變換_第4頁
計算機圖形學課程教學設計圖形繪制變換_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

命左恩碌母配

計算機圖形學

實驗報告

課程名稱:計算機圖形學

實驗名稱:圖形繪制與變換

學院:電子信息工程學院

專業:計算機科學與技術

班級:11計科本01班

學號:111102020103

姓名:_________張慧__________

指導教師:王征風

二零一四年

目錄

一、引言3

二、設計需求3

2.1設計目標3

2.2設計環境3

2.2.1VC++6.03

2.2.2MFC4

2.3設計題目及要求4

2.4總體流程圖4

三、課程設計原理5

3.1實現的算法5

3.1.2Bresenham算法畫直線5

3.1.3中心點算法畫圓和橢圓5

3.2圖形變換的基本原理7

3.2.1平移變換7

3.2.2旋轉變換8

3.2.3比例變換8

四、總體設計與功能實現8

4.1主要界面設計8

4.2設置顏色界面8

4.2.1界面設置代碼8

4.2.2運彳謂果9

4.3二維線畫圖元實現9

4.4畫多邊形功能的實現13

4.5畫Bezier曲線功能的實現14

4.6二維圖形變換的實現16

4.7三維圖形的變換18

五、實驗心得體會

一、引言

計算機圖形學(Comp」terGraphics,簡稱CG)是一種使用數學算法將二維或三維圖形轉

化為計算機顯示器的柵格形式的科學。簡單地說,計算機圖形學的主要研究內容就是研究如何

在計算機中表示圖形、以及利用計算機進行圖形的計算、處理和顯示的相關原理與算法。是計

算機科學的一個分支領域,主要關注數字合成與操作視覺的圖形內容。計算機圖形學研究的是

應用計算機產生圖像的所有工作,不管圖像是靜態的還是動態的,可交互的還是固定的,等等。

圖形API是允許程序員開發包含交互式計算機圖形操作的應用而不需要關注圖形操作細節或

任務系統細節的工具集。計算機圖形學有著廣泛的應用領域,包括物理、航天、電影、電視、

游戲、藝術、廣告、通信、天氣預報等幾乎所有領域都用到了計算機圖形學的知識,這些領域

通過計算機圖形學將幾何模型生成圖像,將問題可視化從而為各領域更好的服務。

計算機圖形學利用計算機產生讓人賞心悅目的視覺效果,必須建立描述圖形的幾何模型還

有光照模型,再加上視角、顏色,紋理等屬性,再經過模型變換、視圖變換、投影操作等,這

些步驟從而實現一個完整的OpenGL程序效果。OpenGL是一個開放的三維圖形軟件包,它獨立

于窗口系統和操作系統,以它為基礎開發的應用程序可以十分方便地在各種平臺間移植。計算

機圖形學通過應用OpenGL的功能,使得生成的圖形效果具有高度真實感。學習計算機圖形學

的重點是掌握OpenGL在圖形學程序中的使用方法。事實上,圖形學也把可以表示幾何場景

的曲線曲面造型技術和實體造型技術作為其主要的研究內容。同時,真實感圖形計算的結果是

以數字圖像的方式提供的,計算機圖形學也就和圖像處理有著密切的關系。

通過21世紀是信息的時代,在日新月異的科技更新中相信計算機會發揮越來越重要的作用,

計算機圖形學也會在更多的領域所應用,雖然我國在這方面還比較薄弱,但相信會有越來越好

的時候的。

二、設計需求

2.1設計目標

以圖形學算法為目標,深入研究。繼而策劃、設計并實現一個能夠表現計算機圖形學算法

原理的或完整過程的演示系統,并能從某些方面作出評價和改進意見。通過完成一個完整程序,

經歷策劃、設計、開發、測試、總結和驗收各階段,達到:鞏固和實踐計算機圖形學課程中的

理論和算法;學習表現計算機圖形學算法的技巧;培養認真學習、積極探索的精神。

2.2設計環境

2.2.1VC++6.0

VC++6.0是Microsoft公司推出的一個基于Windows系統平臺、可視化的集成開發環

境,它的源程序按C++語言的要求編寫,并加入了微軟提供的功能強大的MFC(Microsoft

FoundationClass)類庫。MFC中封裝了大部分WindowsAPI函數和Windows控件,它包含

的功能涉及到整個Windows操作系統。MFC不僅給用戶提供了Windows圖形環境下應用程序

的框架,而且還提供了創建應用程序的組件,這樣,開發人員不必從頭設計創建和管理一個

標準Windows應用程序所需的程序,而是從一個比較高的起點編程,故節省了大量的時間。

另外,它提供了大量的代碼,指導用戶編程時實現某些技術和功能。因此,使用VC-提供的

高度可視化的應用程序開發工具和MFC類庫,可使應用程序開發變得簡單。

2.2.2MFC

MFC(MicrosoftFoundationCIasses),是一個微軟公司提供的類庫(cIass

libraries)以C++類的形式封裝了Windows的API,,它包含了窗口等許多類的定義。各

種類的集合構成了一個應運程序的框架結構,以減少應用程序開發人員的工作量。其中包含

的類包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。MFC6.0

版本封裝了大約200個類,其中的一些可以被用戶直接使用。例如CWnd類封裝了窗口的功

能,包括打印文本、繪制圖形及跟蹤鼠標指針的移動等;CsplitterVnd類是從CWnd類派生

出來的,繼承了基類或稱父類CWnd類的所有特性,但增加了自己的功能,實現拆分窗口,

使窗口至少可被拆分成兩個窗口,用戶可以移動兩個窗口之間的邊框來改變窗口的大小;

CtoolBar類可以定義工具欄等。MFC命名的慣例是類的名字通常是由“C”打頭;成員變量使

用前綴接著使用一個字母來指明數據類型,然后是變量的名稱;所有的單詞用大寫字

母開頭。

2.3設計題目及要求

(1)題目:實現多邊形和曲線的繪制和變換

(2)要求:學會使用VC++編寫實現圖形的繪制變換,需包括直線、曲線、多邊形的繪制和變

換,及三維立體圖形的相應變換.

2.4總體流程圖

繪圖系統

三、課程設計原理

3.1實現的算法

3.1.1DDA算法畫直線

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

已知直線兩端點(x2,y2)則斜率m為:m=(y2-y1)/(x2r1)=Dx/Dy;直線中的

每一點坐標都可以由前一點坐標變化一個增量(Dx,Dy)而得到,即表示為遞歸式:xi+仁xi+Dx

yi+1=yi+Dy。

遞歸式的初值為直線的起點(x1,y1),這樣,就可以用加法來生成一條直線。具體算法是:

該算法適合所有象限,其中用了用了兩個函數如:Integer(-8.5)=-9;Integer(8.5)

=8;Sign(i),根據i的正負,分別得到7,0,+1;

相應代碼:

//DDADrawLine

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

length=abs(x2-x1);

else

length=abs(y2-y1);

Dx=(x2-x1)/length;

Dy=(y2-yl)/length;

x=xl+0.5*Sign(Dx);

y=x2+0.5*Sign(Dy);

i=l;

whilc(i<=lenght)

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

x=x+Dx;

y=y+Dy;

i+=l;}}

3.1.2Bresenham算法畫直線

思路如下:

//假設該線段位于第一象限內且斜率大于0小于1,設起點為(x1.y1),終點為(x2,y2).

//根據對稱性,可推導至全象限內的線段.

1.畫起點(x1,y1).2.準備畫下個點.x坐標增1,判斷如果達到終點,則完成。否則,由圖中

可知,下個要畫的點要么為當前點的右鄰接點,要么是當前點的右上鄰接點.如果線段

ax+by+c=0與x=x1+1的交點的y坐標大于M點的y坐標的話,下個點為U(x1+1,y1+1',否則,

下個點為B(x1+1,y1),3.畫點(U或者B).4.跳回第2步.5.結束.

3.1.3中心點算法畫圓和橢圓

(1)中心點算法畫圓

在一個方向上取單位間隔,在另一個方向的取值由兩種可能取值的中點離圓的遠近而定。

實際處理中,用決策變量的符號來確定象素點的選擇,因此算法效率較高。生成圓弧的中點算

法和上面講到的生成直線段的中點算法類似。

考慮第一象限內X£[O,R/J2]的八分之一圓弧段。經過計算,得出判別式的遞推公式為:

4+2%+3d<0

加二區+2(",)+5

d>0

這兩個遞推公式的初值條件為:

[(%,%,)=QR)

[=5/4-/?

編寫成員函數如下:

voidCMy2_9View::MidPointEllipse(CDC*pDC,doublea,doubleb,intcolor)

(

doublex,yJ.xP,yRsquarea,squareb;

squarea=a*a;

squareb=b*b;

xP=(int)(0.5+(double)squarea/sqrt((double)(squarea+squareb)));

yP=(int)(0.5+(double)squarcb/sqrt((double)(squarca+squarcb)));

x=0;

y=b;

d=4*(squareb-squarea*b)+squarea;

pDC->SetPixel(x.y,color);

while(x<=xP)

{if(d<=0)d+=4<csquarcb*(2*x+3);

else

{d+=4*squarcb*(2*x+3)-8*squarca*(y-1);

y-U

x++;

pDC->SetPixel(x,y,color);}

x=a;

y=0;

d=4*(squarea-a:}:squareb)+squareb;

pDC->SetPixcl(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->SctPixcl(x,y,color);}}

編寫OnDraw函數如下:

voidCMy2_9View::OnDraw(CDC*pDC)

{CMy2_9Doc*pDoc=Ge(Document();

ASSERT_VALID(pDoc);

MidPointEllipse(pDC,50(),3()0.RGB(0,0,0));}

(2)中心點算法畫橢圓

我們先考慮圓心在原點的橢圓的生成,對于中心不是原點的橢圓,可以通過坐標的平移變

換獲得相應位置的橢圓。中心在原點。焦點在坐標軸上的標準橢圓具有X軸對稱、Y軸對稱和

原點對稱特性,已知橢圓上第一象限的P點坐標是(x,y),則橢圓在另外三個象限的對稱點分

別是(x,-y)、(-X.y)和lx,-y)。因此,只要畫出第一象限的四分之一橢圓,就可以利用這

三個對稱性得到整個橢圓,

相應代碼:

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-l))*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平移變換

平移變換函數如下:

voidgITransIate{fd}(TYPEx,TYPEy,TYPEz);

三個函數參數就是目標分別沿三個軸向平移的偏移量。這個函數表示用于這三個偏移量生

成的矩陣乘以當前矩陣。當參數是(0.0,0.0,0.0)時,表示對函數以當ansiate*()的操作是單

位矩陣,也就是對物體沒有影響。

3.2.2旋轉變換

旋轉變換函數如下:

VoidgIRota{fd)TYPEangle,TYPEx,TYPEy,TYPEz);

函數中第一個參數是表示目標沿從點(x,y,z)到原點方向逆時針旋轉的角度,后三個參數是

旋轉的方向點坐標。這個函數表示用這四個參數生成的矩陣乘以當前矩陣。當角度參數是0.0

時,表示對物體沒有影響,

3.2.3比例變換

比例變換函數如下:

VoidglScale(fd)(TYPEx,TYPEy,TYPEz);

單個函數參數值就是目標分別沿三個軸方向縮放的比例因子。這個函數表示用這三個比例

因子生成的矩陣乘以當前矩陣。這個函數能完成沿相應的軸對目標進行拉伸、壓縮和反射三項

功能。以參數x為例,若當x大于1.0時,表示沿x方句拉伸目標;若x小于1.0,表示沿x

軸方向收縮目標;若x=-1.0表示沿x軸反射目標。其中參數為負值時表示對目標進行相應軸

的反射變換。

四、總體設計與功能實現

4.1主要界面設計

二t%畫圖元畫多邊形曲線二維圖形變換三維圖形設置[

4.2設置顏色界面

4.2.1界面設置代碼:

voidCGraphicsView::OnClock()

{WHAT_TO_DO=ID_CLOCK;

clean();

intxx=450,yy=300,r=150,d=5;

inii,while=RGB(255,255,255);

mile(xx,yy,r,COLOR);

Matrixm(xx,240),s(xx,200);

Matrixtl(xx,yy,true),t2(-xx,-yy,(rue),mr(PI/1800),sr(PI/30);

mile(m.gctx(),m.gcty(),d+1,COLOR);

mile(s.getx(),s.gety(),d.COLOR);

dnc(m.gctx(),m.gcty(),xx,yy,COLOR);

dne(s.getx(),s.gety0,xx,yy,COLOR);

for(i=0;i<120;i++){

::Sleep(80);

mile(m.gctx(),m.gcty(),d+1,white);

mile(s.getx(),s.gety().d,white);

dne(m.gctx(),m.gcty(),xx,yy,white);

dne(s.getx(),s.gety(),xx,yy,white);

m=

s=tl*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點擊“設置一顏色”后,運行結果如下:

Graphics

二雄法兩回元~百"詡衫~~二誰回形~三等回形~

i叵]/Q品電通自

一酸色L爾

三kS

L■Lmm

■?Lm==

■W?m

■m=?L

1?

蛆定自定義顏色CD)>>

確定|取消|

4.3二維線畫圖元實現

4.3.1實現代碼:

voidCGraphicsVicw::MidCir(CDC*pdc,intxO,intyO,intxl,intyl,intcolor)

{intr,x,y,deltax,dellay,d;

r=sqrt(((double)x1-(double)xO)*((double)x1-(double)xO)+((double)y1-(double)yO)*((double)y1

(double)yO));

x=0;

y=r;

(ieltax=3;

dcltay=2-r-r;

d=l-r;

while(x<=y)

{::Sleep(time);

pdc->SetPixel(x+xO,y+yO,coIor);

::Sleep(time);

pdc->SetPixeI(-x+xO,y+yO,color);

::Sleep(time);

pdc>SetPixel(x+xO,y+yO,color);

::Slccp(timc);

pdc->SetPixeI(-x+xO,-y+y0.color);

::Slccp(timc);

pdc->SetPixel(y+xO,x+yO,color);

::Sleep(tinie);

pdc->SetPixel(-y+xO,x+yO,color);

::Sleep(time);

pdc->SetPixel(y+x(),-x+yO,color);

::SIeep(time);

pdc->SctPixcl(-y+xO,-x+yO,color);

if(d<0)

{d+=deltax;

dellax+=2;

x++;}

else

{d+=deltax+deltay;

deltax+=2;

dcltay+=2;

x++;

y--;}}}

voidCGraphicsView::midellispse(intxx,intyy,intrl,intr2,intcolor)

{I

voidCGraphicsView::Ellipse(CDC*pdc,intxl,intyl,intx2,inty2,intcolor)

{xx0=(x2+xl)/2;

yy0=(y2+yi)/2;

rra=abs(x2-xl)/2;

rrb=abs(y2-y1)/2;

if(rra==0&&rrb==O)return;

EllipseO(pdc,xxO,yy(),rra,rrb,color);}

voidCGraphicsView::EHipseO(CDC*pdc,intxO,intyO,inta,intb,intcolor)

{inti,yy;

intx,y,deltax,deltay;

intaa,aa2,aa3,bb,bb2,bb3;

doubledI,d2;

aa=a*a;

aa2=aa*2;

aa3=aa*3;

hb=b*b;

bb2=bb*2;

bb3=bb*3;

x=0;

y=b;

dl=bb+aa*(-b+0.25);

deltax=bb3;

deltay=-aa2*b+aa2;

pdc->SetPixelV(x+xO,y+yO,color);

pdc->SctPixclV(x+xO,-y+yO,color);

while(bb*(x+1)<aa*(y-0.5))

{

yy=y;

if(dl<0)

{dl+=deltax;

deltax+=bb2;

x++;}

else

(

dl+=deltax+dellay;

deltax+=bb2;

deltay+=aa2:

x++;

y--;}

::Slccp(timc);

pdc->SctPixelV(x+xO,y+yO,color);

::Sleep(time);

pdc->SetPixelV(-x+xO,y+yO,color);

::Sleep(time);

pdc->SetPixelV(x+xO,-y+yO,color);

::Slccp(timc);

pdc->SetPixelV(-K+xO,-y+yO,color);)

d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb;

del(ax-=bb;

deltay+=aa;

while(y>0)

{if(d2<0)

{d2+=deltax+deltay;

deltax+=bb2;

dcltay+=aa2:

x++;

y??;)

else

{d2+=deltay;

deltay+=aa2:

y-;I

::Sleep(time);

pdc->SetPixelV(x+xO,y+yO,color);

::Sleep(time);

pdc->SelPixelV(-x+xO,y+yO,color);

::Sleep(time);

pdc->SctPixclV(x+x(),-y+yO,color);

::Sleep(time);

pdc->SctPixclV(-x+xO,-y+yO,color);}}

voidCGraphicsView::DDALine(CDC*pdc,intxO,in(yO,intxl,intyI,intcolor)

(

intxx,yy,s,sl,s2,di;

floatdx,dy,k,x,y;

dx=xl-xO;

if(dx、=O)sl=l;

elsesl="l;

dy=y1-yO;

if(dy>=0)s2=l;

elses2=-1;

dx=abs(dx);

dy=abs(dy);

if(dx>=dy)

{

s=O;

di=(int)dx;

k=dy/dx*s2;}

else

{s=l;

di=(int)dy;

k=dx/dy*s1;}

x=xO;

y=yO;

for(inti=O;i<=di;i++)

{if(s==O)

(

xx=(int)x;

yy=(int)(y+0.5);

::Sleep(time);

pdc->SetPixel(xx,yy,color);

x+=sl;

y+=k;}

else{

xx=(int)(x+0.5);

yy=(int)y;

::Sleep(time);

pdc->SetPixel(xx,yy,color);

y+=s2;

x+=k;)})

432點擊二維線畫圖元,課相應畫出直線、圓和橢圓,結果如下:

4.4畫多邊形功能的實現

4.4.1部分實現代碼:

voidCGraphicsView::OnDra\vDuoBX()

{Vertex_Countdig;

if(dlg.DoModal()==IDOK)

{if(dlg.m_verlex_coun(>MAX)

{McssageBox,輸入頂點數過大");

return;}

VertexTotaI=dlg.m_vertex_count;

CDC*pDC=GetDC();

CPenpen(PS_SOLID,2,RGB(255,255,255));

CPen*pOldpen=pDC->Select()bject(&pen);

pDC->MoveTo((int)(inVertexArray[01,x+0.5),(intXinVertexArray[0].y+0.5));

inti;

fbr(i=l;i<inLength;i++)

pDC->LineTo((int)(inVertexArray[i].x+0.5),(int)(iiiVertexArray[i].y+0.5));

pDC->LineTo((int)(inVertexArray[0].x+0.5),(int)(inVertexArray[0].y+0.5));

pDC->SelectObject(pOldpen);

ReleaseDC(pDC);

inLength=O;

outLcngth=0;

WHAT_TO_DO=ID_DrawDuoBX;}}

4.4.2點擊多邊形,輸入定點個數,可繪制出相應的多邊形,結果如下:

多邊形頂點個數:?

確定|取消|

4.5畫Bezier曲線功能的實現

4.5.1部分實現代碼:

voidCGraphicsView::OnBezier()

(

//TODO:Addyourcommandhandlercodehere

WHAT_TO_DO=ID_BEZIER;

CDC*p=GetDC();

p->TextOut(10,20,”PS:鼠標左鍵添加曲線.鼠標右鍵修改曲線.”);

RcleaseDC(p);}

voidCGraphicsView::OnBezierClear()

{n=-l;

RedrawWindow();}

voidCGraphicsView::DrawBczier(DPOINT*p)

{if(n<=0)return;

if((p[n].x<p[0].x+l)&&(p[n].x>p[0].x-l)&&(p[n].y<p[O].y+l)&&(p[n].y>p[O].y-l))

{pDC->SetPixel(p(OJ.x,plOJ.y,COLOR);

return;}

DPOINT*pl;

pl=newDPOINT[n+l];

inti,j;

pl[O]=p[O];

for(i=l;i<=n;i++)

{for(j=0;j<=n-i;j++)

{pUl.x=(p[j].x+pfj+l].x)/2;

pljly=(pljly+p[i+i]-y)/2;}

pl[i]=p[01;}

DrawBezier(p);

DrawBezier(pl);

deletepl;}

voidCGraphicsView::OnBezierAdd()

{AddorMove=1;}

voidCGraphicsView::OnBezierMove()

{AddorMove=-I;}

voidCGraphicsView::OnMouseMove(UINTnFlags,CPointpoint)

{switch(WHAT_TO_DO)

IcaseIDBEZIER:

if(currcnt>=0)

{points[current].x=point.x;

pointslcurrcntj.y=point.y;

RedrawWindow();}

if(current2>=0)

{points[current2J.x=point.x;

points[current21,y=point.y;

RedrawWindow();}

break;}

dcfault:brcak;}

CView::OnMouseMove(nFlags,point);}

4.5.2點擊曲線一Beizer曲線,可實現Beizer曲線的繪制功能,繪制結果如下圖:

圖1圖2

4.5.3點擊曲線一Beizer曲線,可實現Beizer曲線的移動,鼠標點擊其中的任一點,可實

現曲線的移動,繪制結果如下圖:

上圖1移動后的曲線

上圖2移動后的曲線

4.6二維圖形變換的實現

可以實現一橢圓在界面上的隨機移動,一圓在界面上饒某一點的旋轉和一正方形由大變小在

變大的變化,部分實現代碼如下:

voidCGraphicsView::OnXuanzhuan()

{WHAT_TO_DO=ID_XUANZHUAN;

time=0;

OnClear();

CCIientDCdc(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[l][l])/2;

Matrixtl(midx,midy,true),t2(-midx,-midy,true);

Matrixr(PI/50);

Matrixtemp(midx,midy.lrue):

temp=tl*r*t2;

for(i=0;i<200;i++){

::Slccp(50);

MidCir(pDC,a.getx(),a.gelyO,b.getx(),b.getyO,white);

a=temp*a;

b=ternp*b;

MidCir(pDC,a.getx(),a.getyO,b.getx(),b.gety(),COLOR);}

for(i=0;i<200;i++){

::Sleep(50);

MidCir(pDC,a.gctx(),a.gctyO,b.gctx(),b.gctyO,white);

a-lemp*a;

b=temp*b;

MidCir(pDC,a.getx(),a.getyO,b.getx(),b.getyO,COLOR);}

time=5:}

voidCGraphicsView::OnUpdateXuanzhuan(CCmdUI*pCmdUI)

{pCmdUI->SetCheck(WHAT_TO_DO==ID_XUANZHUAN);}

voidCGraphicsView::OnScalc()

{WHAT_TO_DO-ID_SCALE;

OnClearO;

CCIientDCdc(this);

CDC*pDO&dc;

time=0;

inti,white=RGB(255,255,255),pointr4][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][l]+point[3][l])/2;

Matrixsi(sx,sy),s2(l/sx,l/sy);

Matrixtl(midx,midy,true),t2(-midx,-midy,true);

Matrixa(point[0][0],point[0][1]),b(pointfl][0],point[l][l]);

Matrixc(point⑵[0],point⑵[1]),d(point[3][0],point[3][1]);

Matrixtemp(midx,midyjrue);

temp=tl*sl*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.gelx(),a.gely(),c.getx(),c.gely(),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=tcmp*b;

c=tcmp*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=tl*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=ten[p*a;

b=lemp*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);

(ime=5;}

voidCGraphicsView::OnUpdateScale(CCnidUI*pCmdUI)

{pCmdUI->SetCheck(WHAT_TO_DO==ID_SCALE);}

4.7三維圖形的變換

主要實現三維圖形的上下左右平移,分別繞X軸Y軸Z軸的旋轉,放大和縮小,以及正方體

六個面的顏色變換,除此之外,還可以選擇背景顏色的改變

4.7.1部分代碼如下:

voidCGraphicsVicw::OnAoduomianti()

{WHAT_TO_DO=ID_AODUOMIANTI;

CDrawDLGdlgl;

dlgl.DoModaK);}

voidCGraphicsView::OnUpdateAoduomianti(CCmdUI*pCmdUI)

{pCmdUI->SetCheck(WHAT_TO_DO==ID_AODUOMIANTI);}

voidCDiawDLG::OnPaint()

{CPaintDCdc(this);//devicecontextforpainting

CWnd*pWnd=Ge(DIgItem(IDC_DRAW);

pWnd->LJpdatcWindow();

//CDC*PDC=pWnd->GelDC();

Draw();}

voidCDrawDLG::Draw。

{CWnd*pWnd=GetDlgItem(IDC_DRAW);

pWnd->UpdateWindow();

CDC*pDC=pWnd->GetDC();

CRcctrect;

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],pH4],p2[4J,p3[4],p4[4],p5[4J,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)4-d[i].z*sin(b*DU));

vli].y=dlij.y;

v[i].z=(int)(dfi].zxcos(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[l]=w[l];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];p2ril=wni;p2[21=w[5];p2[3]=w[41;

p3[0J=wl1];p3l1J=wl2];p3[2]=w[6];p3[3]=w[5];

p4[01=w[2];p4[1]=w[3];p4[2]=w[7];p4[3]=w[6];

p5[0]=w[0];p5[l]=w[3];p5[2]=w[7];p5[3]=w[4];

switch(Maxnum(z,7))

{caseO:fill(pO,p2,p5,O,2,5);break;

case1:fill(p(),p2,p3,0,2,3);break;

case2:fill(p0,p3,p4,0,3?4);break;

case3:fill(p(),p4,p5,0,4,5);break;

case4:fill(pl,p2,p5,l,2,5);break;

case5:fill(p1,p2,p3,1,2,3);break;

case6:fill(pl,p3,p4,1,3?4);break;

case7:fill(pl.p4,p5,l,4,5);break;}}

BOOLCDrawDLG::OnInitDialog()

{CDialog::OnInitDialog();

m_scroll1.SetScrollRange(-180,180);

m_scroll1.SetScrollPos(O);

m_scroll2.SctScrollRange(-180,180);

m_scroll2.SctScrollPos(0);

m_scroll3.SetScrollRange(-180,180);

m_scroll3.SetScrollPos(0);

m_scroll4.SetScrollRange(0350);

m_scroll4.SetScrollPos(2(X));

m_scroll5.SetScrollRange(0300);

m_scroll5.SctScrollPos(l15);

m_scroll6.SetScrollRange(0.00,300.00);

m_scroll6.SetScrollPos(50.00);

a=b=c=0;

fs=50.00;

SetTimer(IJOO,NULL);

Ctrl=O;

cx=200;

cy=l15;

COLOR1=RGB(123,234,43);

COLOR2=RGB(i23,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(nlD)

{caseIDC_SCROLLBARI:a=pScrollBar->GetScrollPos();

switch(nSBCodc)

{caseSB_LINELEFT:a—;break;

caseSB.LINERIGHT:a++;brcak;

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;

pScroIlBar-^SetScrollPosCa);

break;

caseIDC_SCR0LLBAR2:b=pScrollBar->GetScrollPos();

switch(nSBCode)

{caseSB_LINELEFT:b-;break;

caseSB_LINERIGHT:b-+;break;

caseSB_PAGELEFT:b-=l();break;

caseSB_PAGERIGHT:b+=10;break;

caseSB_THUMBTRACK:b=nPos;brcak;}

if(b<-180)b=180;

if(b>180)b=-180;

pScrolIBar->SetScrol1Pos(b);

break:

caseIDC_SCR()LLBAR3:c=pScrollBar->GetScrollPos();

switch(nSBCode)

{caseSB_L1NELEFT:c—;brcak;

caseSB_LINERIGHT:c++;break;

caseSB_PAGELEFT:c-=10;brcak;

caseSB_PAGERIGHT:c+=10:break;

caseSB_THUMBTRACK:c=nPos;break:}

if(c<-180)c=l80;

if(c>180)c=-180;

pScrollBar->SetScrollPos(c);

break;

caseIDC_SCR0LLBAR4:cx=pScrollBar->GetScrollPos();

switch(nSBCode)

{caseSB_LINELEFT:cx-;break;

caseSB_LINERIGHT:cx++;break;

caseSB_PAGELEFT:cx-=10;break;

caseSB_PAGERIGHT:cK+=IO;break;

caseSB_THUMBTRACK:cx=nPos;break;}

if(cx<0)cx=200:

if(cx>350)cx=200;

pScrol!Bar->SetScrollPos(cx'i;

break;

caseIDC_SCROLLBAR5:cy=pScrollBar->GetScrollPos();

switch(nSBCode)

{caseSB_LINELEFT:cy--;break;

caseSB.LINERIGHT:cy++;brcak;

caseSB_PAGELEFT:cy-=10;break;

caseSB_PAGERIGHT:cy+=10:break;

caseSB_THUMBTRACK:cy=nPos;break;}

if(cy<0)cy=300;

if(cy>3(X))cy=0;

pScrolIBar->SetScrollPos(cyi;

break;

caseIDC_SCROLLBAR6:fs=pScrollBar->GetScrollPos();

switch(nSBCode)

{caseSB_LINELEFT:fs-;break;

caseSB_LINERIGHT:fs++;break;

caseSB_PAGELEFT:fs-=O.55;break;

caseSB_PAGERIGHT:fs+=O.55;break;

caseSB_THUMBTRACK:fs=nPos;brcak;}

if(fs<O)fs=5O;

if(fs>3OO)fs=5O:

pScrol1Bar->SetScrol1Pos(fs);

break;

//

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論