- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
地理与生物信息学院
2010 / 2011 学年第 二 学期
实 验 报 告
课程名称: 计算机图形学
实验名称: Bresenham直线扫描算法的实现
班 级 学 号
学 生 姓 名 郭 超 伟
指 导 教 师 曹 正 林
日 期: 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 直线实现原理
这里需要细化的是怎么判断下个要画的点为当前点的右邻接点还是当前点的右上邻接点
void Ciew::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 Ciew::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(x1x2)
{
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);
原创力文档


文档评论(0)