计算机图形学实验报告_第1页
计算机图形学实验报告_第2页
计算机图形学实验报告_第3页
计算机图形学实验报告_第4页
计算机图形学实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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*s

5、qrt(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=7

6、00;TZ33=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

7、-SetViewportOrg(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.SetMapMod

8、e(MM_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,-re

9、ct.Width()/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

10、(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);Invalidate(FALSE);CView:OnTimer(nIDEvent);void CForYuView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy);SetTimer(1

11、,100,NULL);void CForYuView:Transform()for(int i=0;i4;i+)for(int j=0;j4;j+)S3Dij=0;for(int k=0;k4;k+)S3Dij+=F3Dik*ZHkj;void CForYuView:TOUSHI()for(int i=0;i4;i+)for(int j=0;j4;j+)T3Dij=0;for(int k=0;k0)return TRUE;elsereturn FALSE;void CForYuView:TranslateFrom3DTo2D()for(int i=0;i4;i+)for(int j=0;jSe

12、lectObject(&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-EndPath(); pDC-FillPath();brushg.DeleteObject();if(yu1)CBrush brushr;brushr.CreateSolidBrush(0xFF);pDC-SelectObject(&brushr);pDC

13、-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();brushr.DeleteObject();if(yu2)CBrush brushb;brushb.CreateSolidBrush(0x00FF0000);pDC-SelectObject(&brushb);pDC-BeginPath();pDC-

14、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.DeleteObject();if(yu3)CBrush brushy;brushy.CreateSolidBrush(0x0000FFFF);pDC-SelectObject(&brushy);pDC-BeginPath();pDC-MoveTo(int(F2D30)

15、,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 CForYuView:XW()yu0=XIAOYING(S3D00,S3D01,S3D02,S3D10,S3D11,S3D12,S3D20,S3D21,S3D22,S3D00,S3D01,S3D02); yu1=XIAOYING(S3D00,S3D01,S3D02

16、,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,S3D30,S3D31,S3D32,S3D20,S3D21,S3D22,S3D10,S3D11,S3D12);void CForYuView:OnLButtonDown(UINT nFlags, CPoint point) if(SHU)KillTimer(1)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论