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