1、计算机图形学直线圆二维变换实验一、直线的生成实验目的:1、掌握DDA直线画法、中点画线法和Bresenham画线法2、掌握VC+简单程序设计方法实验容:根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要现在第一象限的直线。实验步骤和方法:首先启动Visual C+ 6.0(注意,其它版本程序无确编译),文件(file)打开工作空间(open workspace)。打开 实验12用基本图形生成基本图形生成.dsw。在fileview窗口,source file下,双击 直线生成view.cpp,或者classview窗口下,cmyview
2、类下相应的函数,按注释改写下列函数:void CMyView:OnDdaline() (此为DDA生成直线)void CMyView:OnBresenhamline()(此为Bresenham画直线)void CMYView:OnMidPointLine()(此为中点画线法)程序代码说明:1、直线的两个端点,由对话框输入,给定程序已经完成输入代码。2、SetPixel的用法:COLORREF SetPixel(int x, int y, COLORREF crColor);/x,y为坐标点。COLORREF SetPixel(POINT point, COLORREF crColor);/po
3、int为坐标点。3、本实验事先提供DDA话直线的函数示(红色部分是重点,其它部分可以不看)中点画直线函数和BresenHam画直线函数由同学们参照dda直线的示例函数自己完成。/以下为DDA画直线的源程序 float x,y,dx,dy,k; dx=(float)(xb-xa); dy=(float)(yb-ya); k=dy/dx; x=xa; y=ya; if(abs(k)1) for (x=xa;xSetPixel(x, int(y+0.5),COLOR); y=y+k; if(abs(k)=1) for(y=ya;ySetPixel(int(x+0.5),y,COLOR); x=x+1
4、/k; /DDA画直线结束/以下为中点画直线的源程序float a,b,d1,d2,d,x,y; a=ya-yb,b=xb-xa,d=2*a+b; d1=2*a,d2=2*(a+b); x=xa,y=ya; pdc-SetPixel(x,y,COLOR); while(xxb) if(dSetPixel(x,y,COLOR); /中点画直线结束/以下为Bresenham画直线的源程序int i,s1,s2,interchange;float f,x,y,deltax,deltay,temp;x=xa;y=ya;deltax=abs(xb-xa);deltay=abs(yb-ya);if(xb-
5、xa=0) s1=1;else s1=-1;if(yb-ya=0) s2=1;else s2=-1;if(deltaydeltax) temp=deltax;deltax=deltay;deltay=temp;interchange=1;else interchange=0;f=2*deltay-deltax;pdc-SetPixel(x,y,COLOR);for(i=1;i=0) if(interchange=1) x+=s1; else y+=s2; pdc-SetPixel(x,y,COLOR); f=f-2*deltax;else if(interchange=1) y+=s2; el
6、se x+=s1; f=f+2*deltay;/Bresenham画直线结束 实验二、圆的生成(中点和Bresenham法)实验目的:1、掌握bresenham画圆的算法。2、掌握VC+简单程序设计方法实验容:根据提供的程序框架,修改部分代码,用Bresenham和中点画圆法画一段圆弧或者画圆。实验步骤和方法:同实验一,修改下列函数:void CMyView:OnBresenhamCircle()void CMyView:OnMidpointCircle()程序代码说明:1、圆的圆心为原点,半径为给定参数,由函数编写时给定,不要求人机交换。/以下请同学们自己编写画圆函数 int x,y; in
7、t c=0; float d; x=0;y=radius;d=1.25-radius; pdc-SetPixel(x0+x),(y0+y),c);pdc-SetPixel(x0-x),(y0+y),c);pdc-SetPixel(x0+x),(y0-y),c);pdc-SetPixel(x0-x),(y0-y),c);pdc-SetPixel(x0+y),(y0+x),c);pdc-SetPixel(x0-y),(y0+x),c);pdc-SetPixel(x0+y),(y0-x),c);pdc-SetPixel(x0-y),(y0-x),c);while (x=y)if (dSetPixel
8、(x0+x),(y0+y),c);pdc-SetPixel(x0-x),(y0+y),c);pdc-SetPixel(x0+x),(y0-y),c);pdc-SetPixel(x0-x),(y0-y),c);pdc-SetPixel(x0+y),(y0+x),c);pdc-SetPixel(x0-y),(y0+x),c);pdc-SetPixel(x0+y),(y0-x),c);pdc-SetPixel(x0-y),(y0-x),c); /中点画圆结束/以下请同学们自己编写画圆函数int c=0;int x=0,y=radius,p=3-2*radius;while(xSetPixel(x0+
9、x),(y0+y),c);pdc-SetPixel(x0-x),(y0+y),c);pdc-SetPixel(x0+x),(y0-y),c);pdc-SetPixel(x0-x),(y0-y),c);pdc-SetPixel(x0+y),(y0+x),c);pdc-SetPixel(x0-y),(y0+x),c);pdc-SetPixel(x0+y),(y0-x),c);pdc-SetPixel(x0-y),(y0-x),c);if(pSetPixel(x0+x),(y0+y),c);pdc-SetPixel(x0-x),(y0+y),c);pdc-SetPixel(x0+x),(y0-y),
10、c);pdc-SetPixel(x0-x),(y0-y),c);pdc-SetPixel(x0+y),(y0+x),c);pdc-SetPixel(x0-y),(y0+x),c);pdc-SetPixel(x0+y),(y0-x),c);pdc-SetPixel(x0-y),(y0-x),c);/BresenHam画圆结束实验三、二维图形的平移实验目的:1、验证二维图形的几何变换矩阵2、掌握VC+简单程序设计实验容:以一条直线段为例,完成目标的平移(缩放等其它变换选做)软件的结果:点击平移,首先会弹出一个对话框要求输入直线的起点和中点,以及平移的数值,确定后,原直线和平移后的直线同时显示。实验
11、步骤和方法:1、打开实验34用/二维变换.dsw2、改写二维变换view.cpp里的void CMyView:OnMove()函数(需要改写的地方已经做了说明)。3、生成直线的函数采用VC里的函数。4、函数的主要任务是计算出平移后的坐标。程序代码说明: 绘制一条直线需要两个函数。 pdc-MoveTo(int x, int y); 将当前点移动至(x ,y)坐标pdc-LineTo(int x, int y); 从当前点绘制一条直线至(x,y)坐标,并将当前点移动至(x,y)。比如,要绘制一条直线,起点(x0, y0),终点(x1, y1):pdc-MoveTo(x0,y0);pdc-Line
12、To(x1,y1);/此处请同学们自己编写,计算出直线两个端点xa1,ya1,xb1,yb1,直线的平移。xa1=xa+dx;ya1=ya+dy;xb1=xb+dx;yb1=yb+dy;实验四、二维图形的旋转实验目的:1、验证二维图形的几何变换矩阵2、掌握VC+简单程序设计实验容:以一个三角形为例,完成二维图形绕任一点旋转。软件的结果:点击平移,首先会弹出一个对话框要求输入三角形的三个顶点,以及要绕着旋转的点和旋转角度,确定后,原图形和变换后的图形同时显示。实验步骤和方法:1、打开二维变换.dsw2、改写二维变换view.cpp里的void CMyView:OnRotate()函数(需要改写的
13、地方我已经做了说明)。3、生成直线的函数采用VC里的函数。4、函数的主要任务是计算出变换后的坐标。程序代码说明: 绘制一条直线需要两个函数。 pdc-MoveTo(int x, int y); 将当前点移动至(x ,y)坐标pdc-LineTo(int x, int y); 从当前点绘制一条直线至(x,y)坐标,并将当前点移动至(x,y)。比如,要绘制一条直线,起点(x0, y0),终点(x1, y1):pdc-MoveTo(x0,y0);pdc-LineTo(x1,y1);/此处请同学们自己编写,计算出变换后的三角形的三个端点xa1,ya1,xb1,yb1,xc1,yc1,三角形的旋转。 x
14、a1=(xa-x)*cos(angle)-(ya-y)*sin(angle)+x; ya1=(xa-x)*sin(angle)+(ya-y)*cos(angle)+y; xb1=(xb-x)*cos(angle)-(yb-y)*sin(angle)+x; yb1=(xb-x)*sin(angle)+(yb-y)*cos(angle)+y; xc1=(xc-x)*cos(angle)-(yc-y)*sin(angle)+x; yc1=(xc-x)*sin(angle)+(yc-y)*cos(angle)+y;实验五、Bezier曲线的生成实验目的:1、掌握曲线的参数化表示方法2、掌握Bezier曲线的生成算法实验容:给定四个或者四个以上的控制点,生成Bezier曲线。生成算法不限。给定的控制点可以直接在程序里给定,控制多边形和Bezier曲线同时显示。实验步骤和方法:1、打开实验5用Bezier曲线/Bezier.dsw2、改写bezierview.cpp里的void CBezierView:OnBezier()函数(需要改写的地方我已经做了说明)。3、生成直线的函数采用VC里的函数。4、实验过程:将t从01按顺序分成若干点,计算每一个点的坐标并按顺序连接
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1