计算机图形学直线圆二维变换.docx
- 文档编号:25607851
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:14
- 大小:358.81KB
计算机图形学直线圆二维变换.docx
《计算机图形学直线圆二维变换.docx》由会员分享,可在线阅读,更多相关《计算机图形学直线圆二维变换.docx(14页珍藏版)》请在冰豆网上搜索。
计算机图形学直线圆二维变换
实验一、直线的生成
实验目的:
1、掌握DDA直线画法、中点画线法和Bresenham画线法
2、掌握VC++简单程序设计方法
实验容:
根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要现在第一象限的直线。
实验步骤和方法:
首先启动VisualC++6.0(注意,其它版本程序无确编译),文件(file)→打开工作空间(openworkspace)。
打开实验12用基本图形生成\基本图形生成.dsw。
在fileview窗口,sourcefile下,双击直线生成view.cpp,或者classview窗口下,cmyview类下相应的函数,按注释改写下列函数:
voidCMyView:
:
OnDdaline()(此为DDA生成直线)
voidCMyView:
:
OnBresenhamline()(此为Bresenham画直线)
voidCMYView:
:
OnMidPointLine()(此为中点画线法)
程序代码说明:
1、直线的两个端点,由对话框输入,给定程序已经完成输入代码。
2、SetPixel的用法:
COLORREFSetPixel(intx,inty,COLORREFcrColor);//x,y为坐标点。
COLORREFSetPixel(POINTpoint,COLORREFcrColor);//point为坐标点。
3、本实验事先提供DDA话直线的函数示(红色部分是重点,其它部分可以不看)中点画直线函数和BresenHam画直线函数由同学们参照dda直线的示例函数自己完成。
//以下为DDA画直线的源程序
floatx,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;x<=xb;x++)
{
pdc->SetPixel(x,int(y+0.5),COLOR);
y=y+k;
}
}
if(abs(k)>=1)
{
for(y=ya;y<=yb;y++)
{
pdc->SetPixel(int(x+0.5),y,COLOR);
x=x+1/k;
}
}
//DDA画直线结束
//以下为中点画直线的源程序
floata,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(x {if(d<0) {x++,y++,d+=d2;} else{x++,d+=d1;} pdc->SetPixel(x,y,COLOR); } //中点画直线结束 //以下为Bresenham画直线的源程序 inti,s1,s2,interchange; floatf,x,y,deltax,deltay,temp; x=xa; y=ya; deltax=abs(xb-xa); deltay=abs(yb-ya); if(xb-xa>=0) s1=1;elses1=-1; if(yb-ya>=0) s2=1;elses2=-1; if(deltay>deltax) {temp=deltax; deltax=deltay; deltay=temp; interchange=1; } elseinterchange=0; f=2*deltay-deltax; pdc->SetPixel(x,y,COLOR); for(i=1;i<=deltax;i++) {if(f>=0){ if(interchange==1)x+=s1; elsey+=s2; pdc->SetPixel(x,y,COLOR); f=f-2*deltax; } else{ if(interchange==1)y+=s2; elsex+=s1; f=f+2*deltay; } } } //Bresenham画直线结束 实验二、圆的生成(中点和Bresenham法) 实验目的: 1、掌握bresenham画圆的算法。 2、掌握VC++简单程序设计方法 实验容: 根据提供的程序框架,修改部分代码,用Bresenham和中点画圆法画一段圆弧或者画圆。 实验步骤和方法: 同实验一,修改下列函数: voidCMyView: : OnBresenhamCircle() voidCMyView: : OnMidpointCircle() 程序代码说明: 1、圆的圆心为原点,半径为给定参数,由函数编写时给定,不要求人机交换。 //以下请同学们自己编写画圆函数 intx,y; intc=0; floatd; 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(d<0)d+=2*x+3; else{d+=2*(x-y)+5;y--;} x++; 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); } //中点画圆结束 //以下请同学们自己编写画圆函数 intc=0; intx=0,y=radius,p=3-2*radius; while(x { 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); if(p<0) p=p+4*x+6; else { p=p+4*(x-y)+10; y-=1; } x+=1; } if(x==y) 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); } //BresenHam画圆结束 实验三、二维图形的平移 实验目的: 1、验证二维图形的几何变换矩阵 2、掌握VC++简单程序设计 实验容: 以一条直线段为例,完成目标的平移(缩放等其它变换选做) 软件的结果: 点击平移,首先会弹出一个对话框要求输入直线的起点和中点,以及平移的数值,确定后,原直线和平移后的直线同时显示。 实验步骤和方法: 1、打开实验34用/二维变换.dsw 2、改写二维变换view.cpp里的voidCMyView: : OnMove()函数(需要改写的地方已经做了说明)。 3、生成直线的函数采用VC里的函数。 4、函数的主要任务是计算出平移后的坐标。 程序代码说明: 绘制一条直线需要两个函数。 pdc->MoveTo(intx,inty);将当前点移动至(x,y)坐标 pdc->LineTo(intx,inty);从当前点绘制一条直线至(x,y)坐标,并将当前点移动至(x,y)。 比如,要绘制一条直线,起点(x0,y0),终点(x1,y1): pdc->MoveTo(x0,y0); pdc->LineTo(x1,y1); //此处请同学们自己编写,计算出直线两个端点xa1,ya1,xb1,yb1,直线的平移。 xa1=xa+dx; ya1=ya+dy; xb1=xb+dx; yb1=yb+dy; 实验四、二维图形的旋转 实验目的: 1、验证二维图形的几何变换矩阵 2、掌握VC++简单程序设计 实验容: 以一个三角形为例,完成二维图形绕任一点旋转。 软件的结果: 点击平移,首先会弹出一个对话框要求输入三角形的三个顶点,以及要绕着旋转的点和旋转角度,确定后,原图形和变换后的图形同时显示。 实验步骤和方法: 1、打开二维变换.dsw 2、改写二维变换view.cpp里的voidCMyView: : OnRotate()函数(需要改写的地方我已经做了说明)。 3、生成直线的函数采用VC里的函数。 4、函数的主要任务是计算出变换后的坐标。 程序代码说明: 绘制一条直线需要两个函数。 pdc->MoveTo(intx,inty);将当前点移动至(x,y)坐标 pdc->LineTo(intx,inty);从当前点绘制一条直线至(x,y)坐标,并将当前点移动至(x,y)。 比如,要绘制一条直线,起点(x0,y0),终点(x1,y1): pdc->MoveTo(x0,y0); pdc->LineTo(x1,y1); //此处请同学们自己编写,计算出变换后的三角形的三个端点xa1,ya1,xb1,yb1,xc1,yc1,三角形的旋转。 xa1=(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.dsw 2、改写bezierview.cpp里的voidCBezierView: : OnBezier()函数(需要改写的地方我已经做了说明)。 3、生成直线的函数采用VC里的函数。 。 4、实验过程: 将t从0~1按顺序分成若干点,计算每一个点的坐标并按顺序连接
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 直线 二维 变换