计算机图形学直线圆二维变换.docx

上传人:b****9 文档编号:25607851 上传时间:2023-06-10 格式:DOCX 页数:14 大小:358.81KB
下载 相关 举报
计算机图形学直线圆二维变换.docx_第1页
第1页 / 共14页
计算机图形学直线圆二维变换.docx_第2页
第2页 / 共14页
计算机图形学直线圆二维变换.docx_第3页
第3页 / 共14页
计算机图形学直线圆二维变换.docx_第4页
第4页 / 共14页
计算机图形学直线圆二维变换.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

计算机图形学直线圆二维变换.docx

《计算机图形学直线圆二维变换.docx》由会员分享,可在线阅读,更多相关《计算机图形学直线圆二维变换.docx(14页珍藏版)》请在冰豆网上搜索。

计算机图形学直线圆二维变换.docx

计算机图形学直线圆二维变换

实验一、直线的生成

实验目的:

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按顺序分成若干点,计算每一个点的坐标并按顺序连接

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 自考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1