计算机图形学实验报告-直线中点Bresenham算法的实现.doc

计算机图形学实验报告-直线中点Bresenham算法的实现.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:400-050-0739(电话支持时间:9:00-19:00)。
计算机图形学实验报告 实验内容 直线中点Bresenham算法的实现 专 业 计算机科学与技术 班 级 学 号 姓 名 指导教师 刘长松       年月 日 1、实验原理 Bresenham?算法?思想: 0≤d≤1? 当d<0.5:下一个象素应取右光栅点(xi+1,yi)? 当d≥0.5:下一个象素应取右上光栅点(xi+1,yi+1)? e=d-0.5??假定直线斜率|k|≤1。e0=?-0.5,x每次加1,e?=?e?+?k;?e<0时,下一像素取?(xi+1,yi),e?=?e?+?k?;?e>0时,下一像素取?(xi+1,yi+1);e?=?e?+?k?-1?;?e=0时,可任取上、下光栅点显示。 当斜率|k|>1时,同理,只是y每次加1,x是否变化取决于增量e。 中点算法 ? d?=2F(M)=2F(Xp+1,Yp+0.5)=2(a(Xp+1)+b(Yp+0.5)+c)????????????其中a=y0-y1,?b=x1-x0,?c=x0y1-x1y0? 当d<0,M在L(Q点)下方,取右上方T为下一个象素;? 此时再下一个象素的判别式为:? ?????????d’?=?2F(Xp+2,Yp+0.5)=2(a(Xp+2)+b(Yp+0.5)+c)??????????????=?2(a(Xp+1)+b(Yp+0.5)+c)?+2a?=?d?+?2a;?当d>0,M在L(Q点)上方,取右方B为下一个象素;? 此时下一个象素的判别式为:? ??????d’?=?2F(Xp+2,Yp+1.5)=2(a(Xp+2)+b(Yp+1.5)+c)? ?????????=?2(a(Xp+1)+b(Yp+0.5)+c)?+2(a?+b)?=?d?+?2(a?+?b);?当d=0,选T或B均可,约定取B为下一个象素;?d0?=?2F(X0+1,Y0+0.5)?=?2(a(X0+1)+b(Y0+0.5)+c)??????????????????=?2(F(X0,Y0)+a+0.5b)? 2、案例分析? MFC提供的CDC类的成员函数MoveTo()和LineTo()函数用于绘制傻 任意斜率的直线段,直线段的颜色由所选用的画笔指定。MoveTo()函数移动当前点到参数(x,y)所指定的点,不画线;LineTo()函数从当前点画一直线段到参数(x,y)所指定的点,但不包括(x,y)。?本案例通过定义Cline类来模拟CDC类绘制任意斜的直线段,采用直线中点Bresenham算法。 3、算法设计? 对于0≤??≤1的直线段,中点Bresenham算法如下:? (1)使用鼠标选择起点坐标p0(x0,y0)和终点坐标p1(x1,y1)。要求起点的的坐标小于等于终点的x坐标。? (2)定义直线段当前点坐标x,y,定义中点误差项d,定义直线斜k,定义像素点颜色clr。? (3)x=x0,y=y0,计算d=0.5-k,k=(y1-y0)/(x1-x0),?clr=CRGB(0,0,1)? (4)绘制点(x,y),判断d的符号。若d<0,则(x,y)更新为(x+1,y+1),d更新为d+1-k;否则(x,y)更新为(x+1,y),d更新为d-k。? (5)如果当前点x<x1,重复步骤(4),否则结束。 4、主要代码 // Line.cpp: implementation of the CLine class. #include "stdafx.h" #include "Line.h" #include "math.h" #define Round(d) int(floor(d+0.5))//四舍五入宏定义 #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif CLine::CLine() { } CLine::~CLine() { } void CLine::MoveTo(CDC *pDC,CP2 p0)//绘制直线起点函数 { P0=p0; } void CLine::MoveTo(CDC *pDC,double x0,double y0)//重载函数 { P0=CP2(x0,y0); } void C

文档评论(0)

二驴的
该用户很懒,什么也没介绍

相关文档

相关课程推荐