计算机图形学Bresenham算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
地理与生物信息学院
2010 / 2011 学年第二学期
实验报告
课程名称:计算机图形学
实验名称:Bresenham直线扫描算法的实现
班级学号 B08021730
学生姓名郭超伟
指导教师曹正林
日期:2011 年4 月
一、实验题目:
Bresenham直线扫描算法的实现
二、实验要求:
学习Visual C++ 6.0集成编程环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础知识,从而掌握利用Visual C++进行图形程序设计的方法以及简单的图形画法,并编程实现Bresenham直线扫描转换程序,得出相应的输出图形。
三、实验内容:
1.学习Visual C++ 6.0集成编成环境的使用;
2.掌握Visual C++ 6.0图形设备接口和常用图形程序设计、菜单设计等方法;
3.编程实现Bresenham直线扫描转换程序,得出相应的输出图形;四、实验过程:
1.算法的基本描述
// 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为
(x2,y2).
// 根据对称性,可推导至全象限内的线段.
1.画起点(x1,y1).
2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.
2.1.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1)
2.2.否则,下个点为B(x1+1,y1)
3.画点(U或者B).
4.跳回第2步.
5.结束
图1 直线实现原理
这里需要细化的是怎么判断下个要画的点为当前点的右邻接点还是当前点的右上邻接点
2.算法的源程序
void CB08021730View::OnMenuline()
{
// TODO: Add your command handler code here
InputDlg dlg;
if(dlg.DoModal()==IDOK)
{
x1=dlg.m_x1;
y1=dlg.m_y1;
x2=dlg.m_x2;
y2=dlg.m_y2;
}
AfxGetMainWnd()->SetWindowText("Bresenham算法");
RedrawWindow();
Bresenham();
}
void CB08021730View::Brensenham()
{
CClientDC dc(this);
CRect Rect;//定义矩形对象
GetClientRect(&Rect);//获得当前窗口的客户区大小
dc.SetMapMode(MM_ANISOTROPIC);//设置MM_ANISOTROPIC映射模式
dc.SetWindowExt(Rect.Width(),Rect.Height());//设置窗口范围
dc.SetViewportExt(Rect.Width(),-Rect.Height());//设置视区范围dc.SetViewportOrg(Rect.Width()/2,Rect.Height()/2);//设置视口原点dc.MoveTo(-Rect.Width(),0);
dc.LineTo (Rect.Width(),0);
dc.MoveTo(0,-Rect.Height()/2);
dc.LineTo (0,Rect.Height()/2);
COLORREF rgb=RGB(0,255,0);//定义直线颜色
double x,y;
double d,k;
k=(y2-y1)/(x2-x1);
if(0<=k && k<=1)//直线斜率[0,1]时
{
if(x1>x2)
{
double tx=x1;
double ty=y1;
x1=x2;y1=y2;
x2=tx;
y2=ty;
}
x=x1;y=y1;
d=0.5-k;
for(x=x1;x<=x2;x++)
{
dc.SetPixel(ROUND(x),ROUND(y),rgb);
if(d<0)
{
y++;
d+=1-k;
}
else
d-=k;
}
}
if(k>1) // 直线斜率k>1时{
if(y1>y2)
{
double tx=x1;
double ty=y1;
x1=x2;y1=y2;
x2=tx;
y2=ty;
}
x=x1;y=y1;
d=1-0.5*k;
for(y=y1;y<=y2;y++)
{
dc.SetPixel(ROUND(x),ROUND(y),rgb);
if(d>=0)
{
x++;
d+=1-k;
}
else
d+=1;
}
}
if(k<-1) //直线斜率k<-1时{
if(y1 { double tx=x1; double ty=y1; x1=x2;y1=y2; x2=tx; y2=ty; } x=x1;y=y1; d=-1-0.5*k; for(y=y1;y>y2;y--) { dc.SetPixel(ROUND(x),ROUND(y),rgb);