版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、命之思窿懵荏计算机图形学实验报告课程名称:计算机图形学实验名称:图形绘制与变换学院:电子信息工程学院专业:计算机科学与技术班级:11 计科本01班学号:111102020103姓 名:张慧指导教师:王征风二零一四年目录引言3、设计需求 32.1 设计目标 32.2 设计环境32.2.1 VC+6.032.2.2 MFC42.3 设计题目及要求42.4 总体流程图4三、课程设计原理 53.1 实现的算法53.1.2 Bresenham 算法画直线53.1.3 中心点算法画圆和椭圆 53.2 图形变换的基本原理 73.2.2 平移变换73.2.3 旋转变换83.2.4 比例变换8四、总体设计与功能
2、实现 84.1 主要界面设计 84.2 设置颜色界面84.2.1 界面设置代码 84.2.2 运彳丁结果 94.3 二维线画图元实现 94.4 画多边形功能的实现 134.5 画Bezier曲线功能的实现144.6 二维图形变换的实现 164.7 三维图形的变换 17五、实验心得体会一、引言计算机图形学(Computer Graphics ,简称CG谑一种使用数学算法将二维或三维图形转 化为计算机显示器 的栅格形式的科学。 简单地说,计算机图形学的主要研究内容就是研究如何 在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。是计 算机科学的一个分支领域,主要关注数字合
3、成与操作视觉的图形内容。计算机图形学研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的, 等等。图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或 任务系统细节的工具集。计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、 游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域 通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。= 计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还| 有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视
4、图变换、投影操作等,这 些步骤从而实现一个完整的OpenGL程序效果。OpenG提一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。计算机图形学通过应用 OpenGL的功能,使得生成的图形效果具有高度真实感。学习计算机图形学 的重点是掌握OpenGL在图形学程序中的使用方法。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。通过21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,
5、 计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。二、设计需求2.1 设计目标以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法 原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:巩固和实践计算机图形学课程中的 理论和算法;学习表现计算机图形学算法的技巧;培养认真学习、积极探索的精神。2.2 设计环境2.2.1 VC+6.0VC+6.0是Microsoft公司推出的一个基于 Windows系统平台、可视化的集成开发环境,它的源程序按 C+
6、语言的要求编写,并加入了微软提供的功能强大的MFC(MicrosoftFoundation Class) 类库。MFC中封装了大部分 Windows API函数和 Windows控件,它包含 的功能涉及到整个 Windows操作系统。MFC不仅给用户提供了 Windows图形环境下应用程序 的框架, 而且还提供了创建应用程序的组件,这样,开发人员不必从头设计创建和管理一个标准Windows应 用程序所需的程序,而是从一个比较高的起点编程,故节省了大量的时间。 另外,它提供了大量的代码,指导用户编程时实现某些技术和功能。因此,使用VC+例供的高度可视化的应用程序开发工具和MFC类库,可使应用程序
7、开发变得简单。2.2.2 MFCMFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries )以C+类的形式封装了 Windows的API ,它包含了窗口等许多类的定义。各 种类的集合构成了一个应运程序的框架结构,以减少应用程序开发人员的工作量。其中包含的类包含大量 Windows句柄封装类和很多 Windows的内建控件和组件的封装类。MFC 6.0版本封装了大约200个类,其中的一些可以被用户直接使用。例如CWnd类封装了窗口的功能,包括打印文本、绘制图形及跟踪鼠标指针的移动等;CsplitterWnd 类是从CWnd类派生
8、出来的,继承了基类或称父类CWnd类的所有特性,但增加了自己的功能,实现拆分窗口,使窗口至少可被拆分成两个窗口,用户可以移动两个窗口之间的边框来改变窗口的大小;CtoolBar类可以定义工具栏等。MFC命名的惯例是类的名字通常是由“C'打头;成员变量使用前缀“ m_',接着使用一个字母来指明数据类型,然后是变量的名称;所有的单词用大写字 母开头。2.3 设计题目及要求(1)题目:实现多边形和曲线的绘制和变换(2)要求:学会使用 VC+褊写实现图形的绘制变换,需包括直线、曲线、多边形的绘制和变 换,及三维立体图形的相应变换.2.4 总体流程图三、课程设计原理3.1 实现的算法3.
9、1.1 DDA算法画直线DDA 是数字微分分析式(Digital Differential Analyzer )的缩写。已知直线两端点(x1,y1)、(x2,y2)则斜率 m为:m = (y2-y1)/(x2-x1)= Dx/Dy;直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式:xi+1=xi+Dxyi+1=yi+Dy 。递归式的初值为直线的起点(x1, y1 ),这样,就可以用加法来生成一条直线。具体算法是:该算法适合所有象限,其中用了用了两个函数如:Integer(-8.5)= -9; Integer(8.5) =8;Sign(i),根据i的正负,分
10、别得到-1 , 0, +1;相应代码:DDA DrawLineif(abs(x2-x1) > abs(y2-y1) |length = abs(x2-x1);Ielselength = abs(y2-y1);Dx = (x2-x1)/length;Dy = (y2-y1)/length;x = x1+0.5*Sign(Dx);y = x2 + 0.5*Sign(Dy);1 = 1; while(i <= lenght) setpixel(Integer(x),Integer(y),color);x= x + Dx;y= y + Dy; i+=1; 3.1.2 Bresenham算法
11、画直线思路如下:/假设该线段位于第一象限内且斜率大于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)中心点算法画圆在一个方向上取单位间隔,在另一个方向
12、的取值由两种可能取值的中点离圆的远近而定。 实际处理中,用决策变量的符号来确定象素点的选择,因此算法效率较高。生成圆弧的中点算法和上面讲到的生成直线段的中点算法类似。考虑第一象限内xw 0, R/J2的八分之一圆弧段。经过计算,得出判别式的递推公式为:di +2x +3 d <0di i =.Q +2(x - yj +5 d >0( x, y,r) E ,这两个递推公式的初值条件为:-:二 :!(2,y0,r) =(0,R)I:d0 =5/4 RSE| 编写成员函数如下:void CMy2_9View:MidPointEllipse(CDC *pDC, double a, doub
13、le b, int color) double x,y,d,xP,yP,squarea,squareb;squarea=a*a;squareb=b*b;xP=(int)(0.5+(double)squarea/sqrt(double)(squarea+squareb);yP=(int)(0.5+(double)squareb/sqrt(double)(squarea+squareb);x=0;y=b;d=4*(squareb-squarea*b)+squarea;pDC->SetPixel(x,y,color);while(x<=xP)if(d<=0) d+=4*square
14、b*(2*x+3);elsed+=4*squareb*(2*x+3)-8*squarea*(y-1);y-;x+;pDC->SetPixel(x,y,color);x=a;y=0;d=4*(squarea-a*squareb)+squareb;pDC->SetPixel(x,y,color);while(y<yP) if(d<=0) d+=4*squarea*(2*y+3); elsed+=4*squarea*(2*y+3)-8*squareb*(x-1); x-; y+;pDC->SetPixel(x,y,color);编写OnDraw函数如下:void CMy
15、2_9View:OnDraw(CDC* pDC)CMy2_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);MidPointEllipse(pDC,500,300,RGB(0,0,0);(2)中心点算法画椭圆我们先考虑圆心在原点的椭圆的生成,对于中心不是原点的椭圆,可以通过坐标的平移变换获得相应位置的椭圆。中心在原点。焦点在坐标轴上的标准椭圆具有X轴对称、丫轴对称和原点对称特性,已知椭圆上第一象限的P点坐标是(x, y),则椭圆在另外三个象限的对称点分别是(x,-y) 、(-x, y)和(-x,-y)。因此,只要画出第一象限的四分之一椭圆,就可以利用这
16、 三个对称性得到整个椭圆。相应代码:void MP_Ellipse(int xc , int yc , int a, int b) double sqa = a * a;double sqb = b * b;double d = sqb + sqa * (-b + 0.25);int x = 0;int y = 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 *
17、 (-2 * y + 2);y-; x+;EllipsePlot(xc, yc, x, y);d = (b * (x + 0.5) * 2 + (a * (y - 1) * 2 - (a * b) * 2;while(y > 0)if (d < 0) d += sqb * (2 * x + 2) + sqa * (-2 * y + 3); x+; elsed += sqa * (-2 * y + 3); y-;EllipsePlot(xc, yc, x, y);3.2图形变换的基本原理3.2.1 平移变换平移变换函数如下:void glTranslatefd(TYPE x, TYP
18、E y, TYPE z);三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用于这三个偏移量生成的矩阵乘以当前矩阵。当参数是 (0.0,0.0,0.0) 时,表示对函数glTranslate*()的操作是单位矩阵,也就是对物体没有影响。3.2.2 旋转变换旋转变换函数如下:Void glRotafdTYPE angle, TYPE x, TYPE y, TYPE z) ;函数中第一个参数是表示目标沿从点 (x,y,z)到原点方向逆时针旋转的角度,后三个参数是 旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度参数是0.0时,表不对物体没有影响。3.2.3 比例变
19、换比例变换函数如下:Void glScalefd(TYPE x, TYPE y, TYPE z) ;单个函数参数值就是目标分别沿三个轴方向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。以参数x为例,若当x大于1.0时,表示沿x方向拉伸目标;若 x小于1.0 ,表示沿x 轴方向收缩目标;若x=-1.0表示沿x轴反射目标。其中参数为负值时表示对目标进行相应轴的反射变换。四、总体设计与功能实现4.1 主要界面设计二送画图元画3边形曲统二维图形变柒三维图形设置匚二4.2 设置颜色界面4.2.1 界面设置代码:void C
20、GraphicsView:OnClock() WHAT_TO_DO=ID_CLOCK;clean();int xx = 450, yy = 300, r = 150,d = 5;int i, white = RGB (255,255,255);mile (xx, yy, r, COLOR);Matrix m (xx, 240), s (xx, 200);Matrix t1 (xx, yy, true), t2 (-xx, -yy, true), mr ( PI/1800 ), sr ( PI/30 );mile (m.getx (), m.gety (), d+1, COLOR);mile (
21、s.getx (), s.gety (), d, COLOR);dne ( m.getx (), m.gety (), xx, yy, COLOR );dne ( s.getx (), s.gety (), xx, yy, COLOR );for (i=0;i<120;i+)二Sleep (80);mile (m.getx (), m.gety (), d+1, white);mile (s.getx (), s.gety (), d, white);dne ( m.getx (), m.gety (), xx, yy, white );dne ( s.getx (), s.gety (
22、), xx, yy, white );m = t1*mr*t2*m;s = t1*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 函某一 画塞达 忌一诂莪一三段日而亘百一三也 阁 有一;妻百同/口 乂"R |昌sss m=
23、L tss mu 警二口定义颜色0C):I: 1- I- 1- I- I- I- I-LLL1 I- LI- 1规定自定义颜色CTQ|石商告4.3二维线画图元实现4.3.1 实现代码:void CGraphicsView:MidCir(CDC *pdc, int x0, int y0, int x1, int y1, int color) int r,x,y,deltax,deltay,d;r=sqrt(double)x1-(double)x0)*(double)x1-(double)x0)+(double)y1-(double)y0 )*(double)y1-(double)y0);x=0;
24、y=r;deltax=3;deltay=2-r-r;d=1-r;while(x<=y) 二Sleep(time);pdc->SetPixel(x+x0,y+y0,color);二Sleep(time);pdc->SetPixel(-x+x0,y+y0,color);二Sleep(time);pdc->SetPixel(x+x0,-y+y0,color);二Sleep(time);pdc->SetPixel(-x+x0,-y+y0,color);二Sleep(time);pdc->SetPixel(y+x0,x+y0,color);二Sleep(time);p
25、dc->SetPixel(-y+x0,x+y0,color);二Sleep(time);pdc->SetPixel(y+x0,-x+y0,color);二Sleep(time);pdc->SetPixel(-y+x0,-x+y0,color);if(d<0) d+=deltax;deltax+=2;x+;else d+=deltax+deltay;deltax+=2;deltay+=2;x+;y-;void CGraphicsView:midellispse(int xx, int yy, int r1, int r2, int color)void CGraphics
26、View:Ellipse(CDC *pdc, int x1, int y1, int x2, int y2, int color) xx0=(x2+x1)/2;yy0=(y2+y1)/2;rra=abs(x2-x1)/2;rrb=abs(y2-y1)/2;if(rra=0 && rrb=0) return;Ellipse0(pdc,xx0,yy0,rra,rrb,color);void CGraphicsView:Ellipse0(CDC *pdc, int x0, int y0, int a, int b, int color) int i,yy;int x,y,deltax
27、,deltay;int aa,aa2,aa3,bb,bb2,bb3;double d1,d2;aa=a*a;aa2=aa*2;aa3=aa*3;bb=b*b;bb2=bb*2;bb3=bb*3;x=0;y=b;d1=bb+aa*(-b+0.25);deltax=bb3;deltay=-aa2*b+aa2;pdc->SetPixelV(x+x0,y+y0,color);pdc->SetPixelV(x+x0,-y+y0,color);while(bb*(x+1)<aa*(y-0.5)yy=y;if(d1<0) d1+=deltax;deltax+=bb2;x+;elsed
28、1+=deltax+deltay;deltax+=bb2;deltay+=aa2;x+;y-;二Sleep(time);pdc->SetPixelV(x+x0,y+y0,color);二Sleep(time);pdc->SetPixelV(-x+x0,y+y0,color);二Sleep(time);pdc->SetPixelV(x+x0,-y+y0,color);二Sleep(time);pdc->SetPixelV(-x+x0,-y+y0,color); d2=bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb; deltax-=bb;d
29、eltay+=aa;while(y>0)if(d2<0) d2+=deltax+deltay;deltax+=bb2;deltay+=aa2;x+;y-; else d2+=deltay;deltay+=aa2;y-; 二Sleep(time);pdc->SetPixelV(x+x0,y+y0,color);二Sleep(time);pdc->SetPixelV(-x+x0,y+y0,color);二Sleep(time);pdc->SetPixelV(x+x0,-y+y0,color);二Sleep(time);pdc->SetPixelV(-x+x0,-
30、y+y0,color);void CGraphicsView:DDALine(CDC *pdc, int x0, int y0, int x1, int y1, int color) int xx,yy,s,s1,s2,di;float dx,dy,k,x,y;dx=x1-x0;if(dx>=0) s1=1;else s1=-1;dy=y1-y0;if(dy>=0)s2=1;elses2=-1;dx=abs(dx);dy=abs(dy);if(dx>=dy)s=0;di=(int)dx;k=dy/dx*s2;elses=1;di=(int)dy;k=dx/dy*s1;x=x0
31、;y=y0;for(int i=0;i<=di;i+)if(s=0)xx=(int)x;yy=(int)(y+0.5);:Sleep(time);pdc->SetPixel(xx,yy,color);x+=s1;y+=k;elsexx=(int)(x+0.5);yy=(int)y;:Sleep(time);pdc->SetPixel(xx,yy,color);y+=s2;x+=k;4.4 画多边形功能的实现4.4.1 部分实现代码:void CGraphicsView:OnDrawDuoBX() Vertex_Count dlg;if(dlg.DoModal()=IDOK)
32、if(dlg.m_vertex_count>MAX) MessageBox("输入顶点数过大");return; VertexTotal=dlg.m_vertex_count;CDC *pDC=GetDC();CPen pen(PS_SOLID,2,RGB(255,255,255);CPen *pOldpen=pDC->SelectObject(&pen);pDC->MoveTo(int)(inVertexArray0.x+0.5),(int)(inVertexArray0.y+0.5); int i;for(i=1;i<inLength;i
33、+)pDC->LineTo(int)(inVertexArrayi,x+0.5),(int)(inVertexArrayi,y+0.5);pDC->LineTo(int)(inVertexArray0.x+0.5),(int)(inVertexArray0.y+0.5);pDC->SelectObject(pOldpen);ReleaseDC(pDC);inLength=0;outLength=0;WHAT_TO_DO=ID_DrawDuoBX;4.4.2 点击多边形,输入定点个数,可绘制出相应的多边形,结果如下:I_次 I多边形顶点个数上51取消确定 |4.5 画Bezie
34、r曲线功能的实现4.5.1 部分实现代码:void CGraphicsView:OnBezier()/ TODO: Add your command handler code hereWHAT_TO_DO=ID_BEZIER;CDC *p=GetDC ();p->TextOut (10, 20, "PS:鼠标左键添加曲线,鼠标右键修改曲线,");ReleaseDC (p);void CGraphicsView:OnBezierClear() n = -1;RedrawWindow();void CGraphicsView:DrawBezier(DPOINT *p) i
35、f (n <= 0) return;if(pn.x < p0.x+1)&& (pn.x> p0.x-1)&& (pn.y< p0.y+1)&& (pn.yp0,y-i)pDC->SetPixel(p,x, p0.y, COLOR);return; DPOINT *p1;pl = new DPOINTn+1;int i, j;p10 = p0;for(i=1; i<=n; i+) for(j=0; j<=n-i;j+) pj,x = (pj.x + pj+1.x)/2;pj.y = (pj,y + pj+i
36、,y)/2; p1i = p0;DrawBezier(p);DrawBezier(pl);delete p1; void CGraphicsView:OnBezierAdd() AddorMove = 1;void CGraphicsView:OnBezierMove() AddorMove = -1;void CGraphicsView:OnMouseMove(UINT nFlags, CPoint point) switch(WHAT_TO_DO) case ID_BEZIER: if(current >= 0 ) pointscurrent.x = point.x;pointscu
37、rrent.y = point.y;RedrawWindow();if(current2 >= 0 ) pointscurrent2.x = point.x;pointscurrent2.y = point.y;RedrawWindow();break; default:break;CView:OnMouseMove(nFlags, point);4.5.2 点击曲线-Beizer曲线,可实现 Beizer曲线的绘制功能,绘制结果如下图:4.5.3 点击曲线-Beizer曲线,可实现 Beizer曲线的移动,鼠标点击其中的任一点,可实 现曲线的移动,绘制结果如下图:上图1移动后的曲线上图
38、2移动后的曲线4.6 二维图形变换的实现可以实现一椭圆在界面上的随机移动,一圆在界面上饶某一点的旋转和一正方形由大变小在变大的变化,部分实现代码如下:void CGraphicsView:OnXuanzhuan() WHAT_TO_DO=ID_XUANZHUAN;time=0;OnClear();CClientDC dc(this);CDC* pDC=&dc;int i, white=RGB(255,255,255), point 22=300,200,300,250;Matrix a (point00,point01), b (point10,point11);int midx=(p
39、oint0+point10)/2,midy=(point01+point11)/2;Matrix t1 (midx, midy,true), t2 (-midx, -midy,true);Matrix r (PI/50);Matrix temp (midx, midy,true);temp = t1*r*t2; for(i=0;i<200;i+) :Sleep(50); MidCir(pDC, a.getx(), a.gety(), b.getx(), b.gety(), white); a = temp*a; b = temp*b;MidCir(pDC, a.getx(), a.get
40、y(), b.getx(), b.gety(), COLOR);for(i=0;i<200;i+) :Sleep(50); MidCir ( pDC,a.getx(), a.gety(), b.getx(), b.gety(), white); a = temp*a; b = temp*b; MidCir (pDC, a.getx(), a.gety(), b.getx(), b.gety(), COLOR);time=5; void CGraphicsView:OnUpdateXuanzhuan(CCmdUI* pCmdUI) pCmdUI->SetCheck(WHAT_TO_D
41、O=ID_XUANZHUAN); void CGraphicsView:OnScale() WHAT_TO_DO=ID_SCALE;OnClear();CClientDC dc(this);CDC* pDC=&dc;time=0;inti,white=RGB(255,255,255),point42=300,250,400,250,300,300,400,300;float sx=0.9,sy=0.85;int midx=(point00+point30)/2,midy=(point01+point31)/2;Matrix s1 (sx,sy),s2 (1/sx,1/sy);Matri
42、x t1 (midx, midy,true), t2 (-midx, -midy,true);Matrix a (point00,point1), b (point10,point11);Matrix c (point20,point21), d (point30,point31);Matrix temp (midx, midy,true);temp = t1*s1*t2;DDALine (pDC,a.getx(),a.gety(),b.getx(),b.gety(),COLOR);DDALine (pDC,a.getx(),a.gety(),c.getx(),c.gety(),COLOR);
43、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.getx(),a.gety(),c.getx(),c.gety(),white);DDALine (pDC,c.getx(),c.gety(),d.getx(),d.ge
44、ty(),white);DDALine (pDC,d.getx(),d.gety(),b.getx(),b.gety(),white);a=temp*a;b=temp*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
45、(),b.getx(),b.gety(),COLOR); temp = t1*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)
46、;a=temp*a;b=temp*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);time=5; void CGraphicsView:OnUpdateScal
47、e(CCmdUI* pCmdUI) pCmdUI->SetCheck(WHAT_TO_DO=ID_SCALE);4.7 三维图形的变换主要实现三维图形的上下左右平移,分别绕 X轴丫轴Z轴的旋转,放大和缩小,以及正方体六个面的颜色变换,除此之外,还可以选择背景颜色的改变4.7.1 部分代码如下:void CGraphicsView:OnAoduomianti() WHAT_TO_DO=ID_AODUOMIANTI;CDrawDLG dlgl;dlg1.DoModal();void CGraphicsView:OnUpdateAoduomianti(CCmdUI* pCmdUI)pCmdUI
48、->SetCheck(WHAT_TO_DO=ID_AODUOMIANTI);void CDrawDLG:OnPaint()CPaintDC dc(this); / device context for paintingCWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();/ CDC *PDC=pWnd->GetDC();Draw();void CDrawDLG:Draw() CWnd *pWnd=GetDlgItem(IDC_DRAW);pWnd->UpdateWindow();CDC *pDC=pWnd->Ge
49、tDC();CRect rect;pWnd->GetClientRect(rect);D v8=-fs,-fs,fs,-fs,fs,fs,fs,fs,fs,fs,-fs,fs,-fs,-fs,-fs,-fs,fs,-fs,f s,fs,-fs,fs,-fs,-fs,d8;POINT p04,p14,p24,p34,p44,p54,w8;int z8;for (int i=0; i<8; i+)di.x=vi.x;di.y=(int)(vi.y*cos(a*DU)-vi.z*sin(a*DU);di.z=(int)(vi.y*sin(a*DU)+vi.z*cos(a*DU);vi.x
50、=(int)(di.x*cos(b*DU)+di.z*sin(b*DU);vi.y=di.y;vi.z=(int)(di.z*cos(b*DU)-di.x*sin(b*DU);di.x=(int)(vi.x*cos(c*DU)-vi.y*sin(c*DU);di.y=(int)(vi.x*sin(c*DU)+vi.y*cos(c*DU);di.z=vi.z;wi.x=di.x+cx;wi.y=di.y+cy; zi=di.z; p00=w0;p01=w1;p02=w2;p03=w3; p10=w4;p11=w5;p12=w6;p13=w7; p20=w0;p21=w1;p22=w5;p23=w
51、4;p30=w1;p31=w2;p32=w6;p33=w5;p40=w2;p41=w3;p42=w7;p43=w6;p50=w0;p51=w3;p52=w7;p53=w4;switch (Maxnum(z,7) case 0:fill(p0,p2,p5,0,2,5);break;case 1:fill(p0,p2,p3,0,2,3);break;case 2:fill(p0,p3,p4,0,3,4);break;case 3:fill(p0,p4,p5,0,4,5);break;case 4:fill(p1,p2,p5,1,2,5);break;case 5:fill(p1,p2,p3,1,2
52、,3);break;case 6:fill(p1,p3,p4,1,3,4);break;case 7:fill(p1,p4,p5,1,4,5);break;BOOL CDrawDLG:OnInitDialog() CDialog:OnInitDialog();m_scroll1.SetScrollRange(-180,180);m_scroll1.SetScro11Pos(0);m_scroll2.SetScrollRange(-180,180);m_scroll2.SetScro11Pos(0);m_scroll3.SetScrollRange(-180,180);m_scroll3.Set
53、Scro11Pos(0);m_scroll4.SetScrollRange(0,350);m_scro114.SetScro11Pos(200);m_scro115.SetScro11Range(0,300);m_scro115.SetScro11Pos(115);m_scro116.SetScro11Range(0.00,300.00);m_scro116.SetScro11Pos(50.00);a=b=c=0;fs=50.00;SetTimer(1,100,NULL);Ctr1=0;cx=200;cy=115;COLOR1=RGB(123,234,43);COLOR2=RGB(123,12
54、3,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);return TRUE; / return TRUE unless you set the focus to a control void CDrawDLG:OnHScro11(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) int nID=pScro11Bar->GetD1gCtr1ID();switch(nID) case IDC_SCROLLBAR1: a=pScro11Bar->GetScro11Pos();switch (nSBCode) case SB_LINELEFT: a-;break;case SB_LINERIGHT: a+;break;case SB_PAGELEFT: a-=10;break;case SB_P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【八年级语文】八年级语文上册期中考试试题(附答案)
- 《微型党课演讲稿》课件
- 山西省吕梁市(2024年-2025年小学六年级语文)部编版课后作业((上下)学期)试卷及答案
- 2024行政助理2024年工作计划(33篇)
- 《艾默生动环材料》课件
- 2024房地产VIP认筹标准协议
- 2024年重组家庭财产分配合同6篇
- 2024年草地养殖场地租赁合同
- 2024年跨国公司区域总部设立合同
- 一匹出色的马课件
- 2024年全国《国防和兵役》理论知识竞赛试题库与答案
- 企业知识产权保护策略及实施方法研究报告
- 2024年07月11026经济学(本)期末试题答案
- 2024年中小企业股权融资合同3篇
- 2024年01月11289中国当代文学专题期末试题答案
- 2024年秋季生物教研组工作计划
- 2024年云南高中学业水平合格考历史试卷真题(含答案详解)
- 2025年董事长年会发言稿范文
- 医院廉洁购销合同
- 车间设备线路安装方案
- 专题11 名著阅读之《童年》(考题猜想)(期中真题速递20题)(含答案解析)
评论
0/150
提交评论