《计算机图形学实验报告》由会员分享,可在线阅读,更多相关《计算机图形学实验报告(10页珍藏版)》请在人人文库网上搜索。
1、计算机图形学课程设计设计名称 正四面体学号 学生 张彬目录1项目描述32任务配置33效果图34原理45算法56源代码57 总结10项目描述本项目使用计算机图形学的知识,在屏幕是绘制一个四个面涂上不同颜色的正四面体,并且正四面体绕着其中一个顶点转动。任务配置本程序使用Visual C+ 6.0,建立一个基于单文档的的项目。效果图原理本程序的原理为先确定原始的正四面体的4个顶点,然后对其进行3维变换,再对其进行透视变化,然后将3维坐标转换为2维坐标,再判断每个面是否可见对其进行动态消影。再将其画到屏幕上。程序使用了双缓冲,并且使用定时器对坐标进行改变。算法对坐标进行3维转换的坐标为先绕x转,再绕y。
2、转,最后绕z转,(这3个矩阵可以参考计算机图形学基础教程110面)将3个矩阵相乘可得ZH00=cos(b)*cos(c);ZH01=cos(b)*sin(c);ZH02=-sin(b);ZH10=cos(c)*sin(a)*sin(b)-cos(a)*sin(c);ZH11=sin(c)*sin(a)*sin(b)+cos(c)*cos(a);ZH12=sin(a)*cos(b);ZH20=cos(a)*sin(b)*cos(c)+sin(a)*sin(c);ZH21=cos(a)*sin(b)*sin(c)-cos(c)*sin(a);ZH22=cos(a)*cos(b);,对其进行透视变换。
3、时乘以矩阵(这个矩阵可以参考计算机图形学基础教程123面),将,都设置为45度,矩阵如下TZ00=-sqrt(2)/2;TZ01=-0.5;TZ02=-0.5;TZ03=0;TZ10=sqrt(2)/2;TZ11=-0.5;TZ12=-0.5;TZ13=0;TZ20=0;TZ21=sqrt(2)/2;TZ22=-sqrt(2)/2;TZ23=0;TZ30=0;TZ31=0;TZ32=700;TZ33=1;将3维坐标转换为2维坐标时,使用公式 x=x1/z1*d,y=y1/z1*d;对其进行动态消隐时,则在平面上取两个向量做差乘,获得其法向量,然后与视向量做数量级,并对其结果判断,大于0则画出该。
4、面,否则不画出该面。另外在框架类里对界面做了改动,去掉了工具栏和状态栏,并且改变了应用程序图标。源代码1.View中得代码CForYuView:CForYuView() SHU=TRUE;yu0=TRUE;yu1=TRUE;yu2=TRUE;yu3=TRUE;AI=100.0;a=0.1;b=0.2;c=0.3;F3D00=4; F3D01=0; F3D02=0; F3D03=1;F3D10=AI;F3D11=0; F3D12=0; F3D13=1;F3D20=AI/2; F3D21=0; F3D22=AI/2*sqrt(3); F3D23=1;F3D00=AI/2; F3D01=AI*sqr。
5、t(6)/3;F3D02=AI/6*sqrt(3);F3D03=1;ZH00=1;ZH01=0;ZH02=0;ZH03=0;ZH10=0;ZH11=1;ZH12=0;ZH13=0;ZH20=0;ZH21=0;ZH22=1;ZH23=0;ZH30=0;ZH31=0;ZH32=0;ZH33=1;TZ00=-sqrt(2)/2;TZ01=-0.5;TZ02=-0.5;TZ03=0;TZ10=sqrt(2)/2;TZ11=-0.5;TZ12=-0.5;TZ13=0;TZ20=0;TZ21=sqrt(2)/2;TZ22=-sqrt(2)/2;TZ23=0;TZ30=0;TZ31=0;TZ32=700;T。
6、Z33=1;void CForYuView:OnDraw(CDC* pDC)CForYuDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);Doublebuffer();void CForYuView:Doublebuffer()GetClientRect(&rect);CDC*pDC=GetDC();pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(rect.Width(),rect.Height();pDC-SetViewportExt(rect.Width(),-rect.Height();pDC-Set。
7、ViewportOrg(rect.Width()/2,rect.Height()/2);CDC dc;dc.CreateCompatibleDC(pDC);CBitmap bitmap,*oldbitmap;bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height();oldbitmap=dc.SelectObject(&bitmap);CPen pen,*oldpen;pen.CreatePen(PS_SOLID,1,0x00FFFFFF);oldpen=dc.SelectObject(&pen);dc.SetMapMode(MM_。
8、ANISOTROPIC);dc.SetWindowExt(rect.Width(),rect.Height();dc.SetViewportExt(rect.Width(),-rect.Height();dc.SetViewportOrg(rect.Width()/2,rect.Height()/2);Transform();TOUSHI();TranslateFrom3DTo2D();XW();DrawObject(&dc);pDC-BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height(),&dc,-rect.Wid。
9、th()/2,-rect.Height()/2,SRCCOPY);dc.SelectObject(oldpen);pen.DeleteObject();dc.SelectObject(oldbitmap);bitmap.DeleteObject();dc.DeleteDC();ReleaseDC(pDC);void CForYuView:OnTimer(UINT nIDEvent) a+=0.3;b+=0.2;c+=0.1;ZH00=cos(b)*cos(c);ZH01=cos(b)*sin(c);ZH02=-sin(b);ZH10=cos(c)*sin(a)*sin(b)-cos(a)*si。
10、n(c);ZH11=sin(c)*sin(a)*sin(b)+cos(c)*cos(a);ZH12=sin(a)*cos(b);ZH20=cos(a)*sin(b)*cos(c)+sin(a)*sin(c);ZH21=cos(a)*sin(b)*sin(c)-cos(c)*sin(a);ZH22=cos(a)*cos(b);Invalidate(FALSE);CView:OnTimer(nIDEvent);void CForYuView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy);SetTimer(1,100,N。
11、ULL);void CForYuView:Transform()for(int i=0;i0)return TRUE;elsereturn FALSE;void CForYuView:TranslateFrom3DTo2D()for(int i=0;iSelectObject(&brushg);pDC-BeginPath();pDC-MoveTo(int(F2D00),int(F2D01);pDC-LineTo(int(F2D10),int(F2D11);pDC-LineTo(int(F2D20),int(F2D21);pDC-LineTo(int(F2D00),int(F2D01);pDC-。
12、EndPath();pDC-FillPath();brushg.DeleteObject();if(yu1)CBrush brushr;brushr.CreateSolidBrush(0xFF);pDC-SelectObject(&brushr);pDC-BeginPath();pDC-MoveTo(int(F2D00),int(F2D01);pDC-LineTo(int(F2D20),int(F2D21);pDC-LineTo(int(F2D30),int(F2D31);pDC-LineTo(int(F2D00),int(F2D01);pDC-EndPath();pDC-FillPath()。
13、;brushr.DeleteObject();if(yu2)CBrush brushb;brushb.CreateSolidBrush(0x00FF0000);pDC-SelectObject(&brushb);pDC-BeginPath();pDC-MoveTo(int(F2D00),int(F2D01);pDC-LineTo(int(F2D10),int(F2D11);pDC-LineTo(int(F2D30),int(F2D31);pDC-LineTo(int(F2D00),int(F2D01);pDC-EndPath();pDC-FillPath();brushb.DeleteObje。
14、ct();if(yu3)CBrush brushy;brushy.CreateSolidBrush(0x0000FFFF);pDC-SelectObject(&brushy);pDC-BeginPath();pDC-MoveTo(int(F2D30),int(F2D31);pDC-LineTo(int(F2D10),int(F2D11);pDC-LineTo(int(F2D20),int(F2D21);pDC-LineTo(int(F2D30),int(F2D31);pDC-EndPath();pDC-FillPath();brushy.DeleteObject();void CForYuVi。
15、ew:XW()yu0=XIAOYING(S3D00,S3D01,S3D02,S3D10,S3D11,S3D12,S3D20,S3D21,S3D22,S3D00,S3D01,S3D02);yu1=XIAOYING(S3D00,S3D01,S3D02,S3D20,S3D21,S3D22,S3D30,S3D31,S3D32,S3D00,S3D01,S3D02);yu2=XIAOYING(S3D00,S3D01,S3D02,S3D30,S3D31,S3D32,S3D10,S3D11,S3D12,S3D00,S3D01,S3D02);yu3=XIAOYING(S3D10,S3D11,S3D12,S3D3。
16、0,S3D31,S3D32,S3D20,S3D21,S3D22,S3D10,S3D11,S3D12);void CForYuView:OnLButtonDown(UINT nFlags, CPoint point) if(SHU)KillTimer(1);SHU=FALSE;elseSetTimer(1,100,NULL);SHU=TRUE;CView:OnLButtonDown(nFlags, point);2.在框架类中的代码为SetIcon(AfxGetApp()-LoadIcon(IDI_ICON1),TRUE);3.在App中的代码为m_pMainWnd-ShowWindow(SW_SHOWMAXIMIZED);总结本程序主要使用了孔教授计算机图形学基础教程中得路径层填充,三维变换,透视变换,动态消隐的知识,做完了一个完整的图形学的程序。