计算机图形学直线圆二维变换.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按顺序分成若干点,计算每一个点的坐标并按顺序连接