计算机图形学基础教程实验,计算机图形学实验报告

这篇实验报告详细介绍了如何使用计算机图形学知识在屏幕上绘制并动态旋转一个四面体,同时应用3D变换、透视变换和消隐算法。程序基于Visual C++ 6.0开发,通过设置定时器来实现四面体的连续旋转。报告中还包含了源代码,展示了从3D坐标到2D坐标的转换过程以及动态消隐的判断方法。
摘要由CSDN通过智能技术生成

《计算机图形学实验报告》由会员分享,可在线阅读,更多相关《计算机图形学实验报告(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);总结本程序主要使用了孔教授计算机图形学基础教程中得路径层填充,三维变换,透视变换,动态消隐的知识,做完了一个完整的图形学的程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1. 通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及bresenham算法的基本原理; 2. 掌握以上算法生成直线段的基本过程; 3. 通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、 复习有关算法的基本原理,明确实验目的和要求; 2、 依据算法思想,绘制程序流程图; 3、 设计程序界面,要求操作方便; 4、 用C/C++语言编写源程序并调试、执行; 5、 分析实验结果 6、 对程序设计过程中出现的问题进行分析与总结; 7、 打印源程序或把源程序以文件的形式提交; 8、 按格式要求完成实验报告实验报告要求: 1、 各种算法的基本原理; 2、 各算法的流程图 3、 实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、 实验总结(含问题分析及解决方法) 实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、 通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、 掌握以上算法生成圆和圆弧的基本过程; 3、 掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1. 复习有关圆的生成算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3. 设计程序界面,要求操作方便; 4. 用C/C++语言编写源程序并调试、执行; 5. 分析实验结果 6. 对程序设计过程中出现的问题进行分析与总结; 7. 打印源程序或把源程序以文件的形式提交; 8. 按格式要求完成实验报告实验报告要求: 1. 分析算法的工作原理; 2. 画出算法的流程图 3. 实验结果及分析(比较圆与圆弧生成算法的不同) 4. 实验总结(含问题分析及解决方法) 实验3 多边形的区域填充 学时:2 实验类型:设计性 实验类别:专业实验 实验目的 1. 通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理 2. 掌握多边形区域填充算法的基本过程 3. 掌握在C/C++环境下用多边形填充算法编程实现指定多边形的填充。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用种子填充算法和扫描线填充算法等任意两种算法实现指定多边形的区域填充。 实验步骤 1. 复习有关算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(指定填充多边形); 3. 设计程序界面,要求操作方便; 4. 用C/C++语言编写源程序并调试、执行(最好能用动画显示填充过程); 5. 分析实验结果 6. 对程序设计过程中出现的问题进行分析与总结; 7. 打印源程序或把源程序以文件的形式提交; 8. 按格式要求完成实验报告实验报告要求: 1. 分析算法的工作原理; 2. 画出算法的流程图 3. 实验结果及分析(比较两种算法的不同) 4. 实验总结(含问题分析及解决方法)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值