实验一、直线的生成
实验目的:
1、掌握DDA直线画法、中点画线法和Bresenham画线法 2、掌握VC++简单程序设计方法
实验容:
根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要现在第一象限的直线。
实验步骤和方法:
首先启动Visual C++ 6.0(注意,其它版本程序无确编译),文件(file)→打开工作空间(open workspace)。打开 实验12用基本图形生成\\基本图形生成.dsw。在fileview窗口,source file下,双击 直线生成view.cpp,或者classview窗口下,cmyview类下相应的函数,按注释改写下列函数: 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);//point为坐标点。
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;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画直线结束
//以下为中点画直线的源程序
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(x {x++,y++,d+=d2;} else {x++,d+=d1;} pdc->SetPixel(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-xa>=0) s1=1;else s1=-1; if(yb-ya>=0) s2=1;else s2=-1; if(deltay>deltax) { temp=deltax; deltax=deltay; deltay=temp; interchange=1; } else interchange=0; f=2*deltay-deltax; pdc->SetPixel(x,y,COLOR); for(i=1;i<=deltax;i++) { if(f>=0){ if(interchange==1) x+=s1; else y+=s2; pdc->SetPixel(x,y,COLOR); f=f-2*deltax; } else { if(interchange==1) y+=s2; else x+=s1; f=f+2*deltay; } } } //Bresenham画直线结束 实验二、圆的生成(中点和Bresenham法) 实验目的: 1、掌握bresenham画圆的算法。 2、掌握VC++简单程序设计方法 实验容: 根据提供的程序框架,修改部分代码,用Bresenham和中点画圆法画一段圆弧或者画圆。 实验步骤和方法: 同实验一,修改下列函数: void CMyView::OnBresenhamCircle() void CMyView::OnMidpointCircle() 程序代码说明: 1、圆的圆心为原点,半径为给定参数,由函数编写时给定,不要求人机交换。 //以下请同学们自己编写画圆函数 int x,y; int 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);