《MFC计算机图形学课程设计报告地砖铺设解读.pdf》由会员分享,可在线阅读,更多相关《MFC计算机图形学课程设计报告地砖铺设解读.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 计算机图形学 课程设计 项目题目:地砖图案设计和铺设效果的模拟设计 专 业:计算机科学与技术 班级学号:姓 名:指导教师:李丽亚 2014 年 6 月 一、项目概述 在计算机高速发展的今天,计算机模拟现实已经逐步成为一次计算机的科技革命,模拟系统的生成和应用也逐步发展和成熟。在这个模拟系统中对于地砖图案样式的设计我们利用window 7操作系统下Microsoft Visual C+6.0中的MFC,采用二维坐标点来进行绘制地砖图案样式,并对其运行、调试。对其整体铺设效果的模拟我们采用平移变换矩阵,任意点的旋转变换矩阵对二维的图形进行整体铺设,使其变成一个完整的图案。我们还在系统中加入了地砖
2、数量的的计算,在MFC中新建了一个Dialog的控制窗口,通过用户给定房间的长宽来计算房间所需地砖总数(地砖样式规格是800mm800mm)。在设计完这些之后我们为了使铺设效果更佳逼真,加入了三维的坐标点,利用斜等测变换矩阵实现了地砖铺设的立体效果,这样更能增强观赏度。在工程实际中经常会遇到房屋地板砖的铺设问题,在此类为题中,我们需要考虑地板砖的成本、铺设人工费用以及地板砖破损成本等方面因素,来使成本最小化。通过对求解的结果比较选取成本最低的模型。我们可以将铺设块数、费用及利用率的问题的计算归结到地板砖铺设最低费用的问题中。比较五种地板砖铺设总费用:尺寸 800*800 600*600 400
3、*400 300*300 600*300 300*600 所需总费用 42757 49988 60521 60807 58365 57814 我们可以得到,选择铺设规格为800mm*800mm的地板砖所需费用最少,为42757元。通过上面分析可知800mm*800mm规格的地板砖性价比最高,我们可以优先利用800*800的地板砖进行模拟块数的铺设,在不能铺设完整规格的800mm*800mm的区域外,再用其他规格的地板砖进行切割填补。二、项目需求 2.1 几何变换的原理 计算机图形系统的基本功能之一是模拟在空间对物体进行操纵。这种模拟的空间操纵称为变换。可以从两种互补的观点出发来描述物体的变换。
4、第一种是物体本身相对于一个固定不动的坐标系或背景作变换。此观点从数学角度讲就是对物体上的每一个点进行几何变换。第二种观点将物体看成固定不动,而坐标系则 相对于物体作变换。这一效果可通过进行坐标变换来取得。物体的空间操纵有三种基本形式。第一,它们可以在不改变大小和朝向的前提下移动到新的位置。第二,它们可以被放大和缩小。第三,它们可以绕一个点或一条轴旋转。但本论文设计中只应用了后两者几何变换。在程序设计中,在缩放以及旋转几何变换时首先必须建立 modelview 的矩阵。它是和来进行建模变换与观察变换的合成变换矩阵。这个建模与观察矩阵的初始化可以通过以下语句完:glMatrixMode(GL_MO
5、DELVIEW);glLoadIdentity();其中 glMatrixMode 将建模与观察矩阵设为系统当前的矩阵,所有随后指定的变换都对当前的矩阵生效。2.2 几何变换旋转 r(x,y)yx(x,y)r 图 3 二维旋转(几何变换)平面上的旋转是相对于一个点(旋转中心)来进行的,而空间中的旋转则是相对于一条轴来完成。我们将基本的两维旋转定义为绕 xy 坐标系的原点进行。图 3 表示位于(x,y)的点经过大小为角的两维几何旋转 R()后的新位置(x,y)。首先考虑斜边连接原点及(x,y)的直角三角形并使用三角恒等式来得到:然后从斜边连接原点及(x,y)的另一个直角三角形得到 x=rcos和
6、 y=rsin。sinsincoscos)cos(sincoscossin)sin(yrrrxrrrsincossincosyxxyxy 将此结果代入上式就有:在二维旋转的基础上,来实现三维旋转。三维旋转有三种基本方式:绕 z 轴旋转(见图 4(a)和 5(a),绕 x 轴旋转(见图 4(b)和 5(b),绕 y 轴旋转(见图 4(c)和 5(c)。与正旋转角在二维旋转中意味着反时针旋转的规定一致,正旋转角在三维旋转中意味着旋转方向按右手定则确定(拇指与旋转轴指向相同时,其余四指给出旋转方向)。yyyxxxzzz(x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z
7、)(b)(a)(c)图 4 三维旋转(几何变换)yyyxxxzzz(x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,y,z)zzzxxxyyy(a)(b)(c)图 5 三维旋转(几何变换)绕 y轴旋转时(既包括几何变换 Ry()也包括与其互补的坐标变换 Ry(-))物体上的点的 y 坐标保持不变。这就是说每个点可以看成是一个与 xz 平面平行的平面上旋转旋转方式与一个在 xz 平面上的点完全相同。于是我们可以得出三维旋转公式:旋转变换可以通过调用 glRotate*语句来实现:void glRotatef d(TYPE angle,TYPE x,TYPE y,TYPE
8、 z)其中该函数有四个 GLfloat 或 GLdouble 类型的参数:angle,x,y 和 z。angle 表示sincossincosxzzyyxzx 要旋转的角度,以度数方式表示,为 0360 之间的值;x,y,z 构成一个向量,依次代表该向量 x,y,z 三个方向上的分量值,旋转是按反时针方向围绕从原点到(x,y,z)的轴进行。在设计中单方面的对 X 轴、Y 轴、Z 轴中的某一轴定义旋转这样会使三维立体图在实现旋转时存在单一性和局限性,所以通过程序的编写对参数的改变使旋转可以通过任意轴旋转来完成,在设计中可以围绕一条经过某一点并与它的方向向量同向的轴线作为任意轴旋转。目前地砖图案设
9、计大多手绘或者通过相机拍摄实物地砖实现其整体效果,很不方便。我们通过计算机模拟系统来建立地砖设计及铺设效果。开发一种既能设计地砖图案,又能根据所给地面尺寸自动铺设地砖,同时生成整体预览效果图的一种系统软件,节省人力物力资源。技术需求:地砖的铺设效果图通常都是由实体地砖铺设后拍照而来,而计算机模拟地砖铺设并给出铺设效果图实现了计算机模拟显示,技术先进,省时省力。思维需求:通过现在已有的高科技来高效实现对瓷砖的设计和方案规划,既体现了人们对高科技的充分利用,同时更加体现了人们思维的极大转变,不再依靠粗糙的手段来设计方案。三、项目设计 3.1 前期准备:前期先对资料进行一定的搜集,搜集地砖图案样式,
10、对其可行性进行分析,并集中整理和归纳以及搜集在Microsoft Visual C+6.0中的 MFC 运行环境中操作的相关资料,为开发模拟系统做准备。3.2 组织实施:搜集完成之后利用window 7 操作系统下 Microsoft Visual C+6.0 中的 MFC对所搜集到的地砖图案进行二维坐标点的计算,利用 MFC 中的画笔对这些坐标点进行绘制,使这些地砖图案样式出现在模拟系统界面。最后将所绘制出的地砖样式运用 MFC 中旋转矩阵和平移矩阵的算法,将这些样式进行一定的旋转和平移,使其在系统界面勾勒出该地砖的完整图案。在制作完这些之后,加入了三维坐标点,利用算法中的斜等测算法使绘制的
11、地砖样式产生了立体效果,使得这个地砖铺设系统更佳的逼真。3.3 预期效果:1、搜集地砖图案样式,并对其可行性进行分析。对所采集的地砖样式图案在 VC+6.0中进行图案绘制。2、对已经设计好的地砖样式进行平移旋转拼接,使其成为一个完整的图案。3、设计在已知房间长和宽的基础上,计算出房间所需铺设地砖的总块数。4、利用平行投影中的斜等测变换矩阵,让铺设立体化,使其效果更佳逼真。3.4 绘制地砖代码:void CTestView:DrawObject1()/绘制地砖 CRect Rect;GetClientRect(&Rect);CDC*pDC=GetDC();pDC-SetMapMode(MM_AN
12、ISOTROPIC);/自定义坐标系 pDC-SetWindowExt(Rect.Width(),Rect.Height();pDC-SetViewportExt(Rect.Width(),-Rect.Height();/x轴水平向右,y轴垂直向上 pDC-SetViewportOrg(Rect.Width()/2,Rect.Height()/2);/屏幕中心为原点 CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,5,RGB(0,0,0);pOldPen=pDC-SelectObject(&NewPen);CBrush NewBrush,*pOld
13、Brush;NewBrush.CreateSolidBrush(RGB(255,0,0);pOldBrush=pDC-SelectObject(&NewBrush);pDC-Rectangle(ROUND(Q1.x),ROUND(Q1.y),ROUND(Q2.x),ROUND(Q2.y);pDC-Pie(ROUND(Q6.x),ROUND(Q6.y),ROUND(Q7.x),ROUND(Q7.y),ROUND(Q1.x),ROUND(Q1.y),ROUND(Q2.x),ROUND(Q2.y);/大圆弧 pDC-MoveTo(ROUND(Q5.x),ROUND(Q5.y);pDC-LineTo(
14、ROUND(Q4.x),ROUND(Q4.y);pDC-MoveTo(ROUND(Q1.x),ROUND(Q1.y);pDC-LineTo(ROUND(Q8.x),ROUND(Q8.y);pDC-MoveTo(ROUND(Q5.x),ROUND(Q5.y);pDC-LineTo(ROUND(Q8.x),ROUND(Q8.y);pDC-MoveTo(ROUND(Q4.x),ROUND(Q4.y);pDC-LineTo(ROUND(Q8.x),ROUND(Q8.y);pDC-MoveTo(ROUND(Q5.x),ROUND(Q5.y);pDC-LineTo(ROUND(Q9.x),ROUND(Q9
15、.y);pDC-MoveTo(ROUND(Q9.x),ROUND(Q9.y);pDC-LineTo(ROUND(Q4.x),ROUND(Q4.y);pDC-MoveTo(ROUND(Q9.x),ROUND(Q9.y);pDC-LineTo(ROUND(Q2.x),ROUND(Q2.y);void CTestView:OnMstyle1()/设计地砖样式 /TODO:Add your command handler code here RedrawWindow();ReadPoint1();DrawObject1();3.5 变换矩阵 void CTransForm:Identity()/单位矩
16、阵 T00=1.0;T01=0.0;T02=0.0;T03=0.0;T10=0.0;T11=1.0;T12=0.0;T13=0.0;T20=0.0;T21=0.0;T22=1.0;T23=0.0;T30=0.0;T31=0.0;T32=0.0;T33=1.0;void CTransForm:Translate(double tx,double ty,double tz)/平移变换矩阵 Identity();T30=tx;T31=ty;T32=tz;MultiMatrix();/*void CTransForm:Scale(double sx,double sy)/比例变换矩阵 Identity
17、();T00=sx;T11=sy;MultiMatrix();/*void CTransForm:Scale(double sx,double sy,CP2 p)/相对于任意点的整体比例变换矩阵 this-Translate(-p.x,-p.y);this-Scale(sx,sy);this-Translate(p.x,p.y);*/*void CTransForm:ReflectO()/原点反射变换矩阵 Identity();T00=-1;T11=-1;MultiMatrix();void CTransForm:ReflectX()/X轴反射变换矩阵 Identity();T00=1;T22
18、=-1;MultiMatrix();void CTransForm:ReflectY()/Y轴反射变换矩阵 Identity();T00=-1;T11=1;MultiMatrix();void CTransForm:Shear(double b,double c)/错切变换矩阵 Identity();T01=b;T10=c;MultiMatrix();*/void CTransForm:MultiMatrix()/矩阵相乘 CP3*PNew=new CP3num;for(int i=0;inum;i+)PNewi=POldi;for(int j=0;jTranslate1(-p.x,-p.y)
19、;this-Rotate1(beta);this-Translate1(p.x,p.y);void CTransForm:MultiMatrix1()/矩阵相乘 CP2*PNew=new CP2num1;for(int i=0;inum1;i+)PNewi=POld1i;for(int j=0;jnum1;j+)POld1j.x=PNewj.x*S00+PNewj.y*S10+PNewj.w*S20;POld1j.y=PNewj.x*S01+PNewj.y*S11+PNewj.w*S21;POld1j.w=PNewj.x*S02+PNewj.y*S12+PNewj.w*S22;delete P
20、New;四、项目效果 1、程序运行主界面说明(如图1)图 1 2、其中一个图案的地砖样式演示效果(如图2)图 2 3、该地砖样式整体拼接之后的图案效果演示(如图 3)图 3 4、地砖样式在二维坐标点下的铺设效果(如图4)图4 5、该地砖样式经过斜等测变换后的三维立体效果演示(如图5)图5 6、经过变换后的地砖样式的整体拼接效果演示(如图 6)图6 五、算法改进 斜等测变换 void CTestView:ObliqueProject()/斜等测变换 for(int i=0;iSetMapMode(MM_ANISOTROPIC);/自定义坐标系 pDC-SetWindowExt(Rect.Widt
21、h(),Rect.Height();pDC-SetViewportExt(Rect.Width(),-Rect.Height();/x轴水平向右,y轴垂直向上 pDC-SetViewportOrg(Rect.Width()/2,Rect.Height()/2);/屏幕中心为原点 CPen NewPen,*pOldPen;NewPen.CreatePen(PS_SOLID,2,RGB(0,0,0);pOldPen=pDC-SelectObject(&NewPen);ObliqueProject();CBrush NewBrush,*pOldBrush;NewBrush.CreateSolidBr
22、ush(RGB(255,255,0);pOldBrush=pDC-SelectObject(&NewBrush);pDC-BeginPath();pDC-MoveTo(ROUND(ScreenP1.x),ROUND(ScreenP1.y);pDC-LineTo(ROUND(ScreenP4.x),ROUND(ScreenP4.y);pDC-LineTo(ROUND(ScreenP2.x),ROUND(ScreenP2.y);pDC-LineTo(ROUND(ScreenP3.x),ROUND(ScreenP3.y);pDC-LineTo(ROUND(ScreenP1.x),ROUND(Scre
23、enP1.y);pDC-EndPath();pDC-StrokeAndFillPath();/pDC-Arc(ROUND(ScreenP6.x),ROUND(ScreenP6.y),ROUND(ScreenP7.x),ROUND(ScreenP7.y),ROUND(ScreenP1.x),ROUND(ScreenP1.y),ROUND(ScreenP2.x),ROUND(ScreenP2.y);/大圆弧 pDC-MoveTo(ROUND(ScreenP5.x),ROUND(ScreenP5.y);pDC-LineTo(ROUND(ScreenP4.x),ROUND(ScreenP4.y);pD
24、C-MoveTo(ROUND(ScreenP1.x),ROUND(ScreenP1.y);pDC-LineTo(ROUND(ScreenP8.x),ROUND(ScreenP8.y);pDC-MoveTo(ROUND(ScreenP5.x),ROUND(ScreenP5.y);pDC-LineTo(ROUND(ScreenP8.x),ROUND(ScreenP8.y);pDC-MoveTo(ROUND(ScreenP4.x),ROUND(ScreenP4.y);pDC-LineTo(ROUND(ScreenP8.x),ROUND(ScreenP8.y);pDC-MoveTo(ROUND(Scr
25、eenP5.x),ROUND(ScreenP5.y);pDC-LineTo(ROUND(ScreenP9.x),ROUND(ScreenP9.y);pDC-MoveTo(ROUND(ScreenP9.x),ROUND(ScreenP9.y);pDC-LineTo(ROUND(ScreenP4.x),ROUND(ScreenP4.y);pDC-MoveTo(ROUND(ScreenP9.x),ROUND(ScreenP9.y);pDC-LineTo(ROUND(ScreenP2.x),ROUND(ScreenP2.y);六、项目总结 从处理项目问题处理来说:在完成设计的过程中处理问题的能力才是我
26、们此次的提升所在,我们因此也学会了处理问题的不同方法,在处理问题的同时我们也增加了对项目的认识和理解程度。在此次“地砖图案设计和铺设效果的计算机模拟系统”的实现过程中遇到了各种各样的问题,如同:(1)算法实现问题(2)局部地砖的布局问题(3)整体地砖的效果呈现问题(4)对话框的分栏问题(5)对话框的代码实现问题(6)地砖由平面图向斜视图的转变问题等等。在逐个解决问题的过程中我们学到了各种各样处理问的能力。总结的几点以后的自我建议:(1)多总结实施过程中遇到的问题,随时记录下来;(2)善于和同学和老师进行合理的沟通,有助于项目的完善;(3)在做项目的同时一定要确保文档的准确性,随时记录,随时增删改查文档;(4)在做项目前一定要策划好项目的方向,只有在策划完善的情况下我们才能找到努力的方向,才会走的更远!一个相对完美的项目能够引出一个有力的着力点,一个团队在立项的过程中往往会选择不同的角度去尝试立项,这就如同一个准备驶向远方的大船一样,掌舵的人需要把握好一个精准的方向,这艘巨轮才不会偏离航线,最终才会顺利地抵达目的地!