- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.1直线扫描转换算法的实现
图形基元扫描转换算法的实现
目前,我们最常用的图形显示设备是光栅扫描式图形显示器,简称光栅显示器。光栅显示器是一种画点设备,它可以看作是一个像素点矩阵,每个像素可以用一种或多种的颜色显示,分别称为单色显示器或彩色显示器。在光栅显示器上显示的任何一种图形,实际上都是一些具有一种或多种颜色的像素的集合。例如,光栅显示器不能直接从像素矩阵中的一个像素画一条直线到另一个像素,只能用尽可能的靠近这条直线路径上的像素点集合来近似的表示这条直线。将要显示在光栅显示器上的图形描述转换成用像素点集合来表示的过程称为扫描转换。为了降低图形扫描转换的复杂度,我们往往将复杂图形分解成一些基本的简单图形的组合,这些基本图形称为图形基元。图形基元的选择可以有不同的方法,但是通常都会把线段、圆和多边形选为图形基元。本章将通过MFC编程的方式实现线段、圆和多边形的扫描转换算法,并创建一个MFC应用程序项目来演示这些扫描转换算法的结果。
为了能够更好的演示扫描转化算法的结果,我们创建一个MFC应用程序项目(除了选择单文档外,其它选项使用默认选择),项目名称为ScanarithDemo,然后创建一个普通类CDraw,我们在该类中实现扫描转换算法。为视图类CScanarithDemoView添加WM_LBUTTONDOWN(鼠标左键按下)消息、WM_LBUTTONDBLCLK(鼠标左键双击)消息、WM_MOUSEMOVE(鼠标移动)消息和WM_KEYDOWN(键盘按键按下)消息的处理函数,这样我们可以更灵活的决定图形基元的形状,然后调用相应的扫描转换函数进行绘制。为了能够选择不同的扫描转换函数,我们在CScanarithDemoView类中添加如下成员变量,并在构造函数中设置它们的初始值为0:
public:
//选择绘制哪种图形基元
int m_SelectDraw;
//选择使用哪种扫描转换算法
int m_SelectArithmetic;
再在CScanarithDemoView类中添加如下成员变量:
public:
//节点列表
CArrayCPoint,CPoint m_PointsList;
CArray是MFC封装的列表类,其对象声明方式与CList相同,上面的声明表示列表中存放的是CPoint对象。而其使用方法与CObArray类似,具有类似的成员函数。该对象的作用是存储线段和多边形的节点,或者是用来控制圆的形状。现在我们已经做好了演示程序的准备工作,下面开始介绍图形基元扫描转换算法的实现和演示。
直线扫描转换算法的实现
直线扫描算法的任务是根据传入的线段的两个端点的坐标,求出构成该线段的所有像素点的坐标。常用的直线扫描转换算法有DDA直线扫描转换算法、中点画线法和Bresenham画线算法。
DDA直线扫描转换算法的实现
数值微分分析器(Digital Differential Analyzer,简称DDA)直线扫描转换算法的基本思想是:设要绘制的直线段的两个端点为(x1, y1)和(x2, y2),根据直线方程y = mx + b,可得:
m = (y2 – y2)/(x2 – x1),b = (x2y1 – x1y2)/(x2 –x1)
当|m|≤1时,对x每增1取允许的各整数y值(根据直线方程计算出y值后取整),当|m|1时,对y每增1取允许的各整数x值。因为对于直线来说,数值微分为:
m = Δy/Δx = (yi+1 - yi)/(xi+1 – xi)
所以当|m|≤1时,yi+1 = yi + m(xi+1 – xi),于是当xi+1 = xi + 1时,yi+1 = yi + m;当|m|1时,xi+1 = xi + (yi+1 – yi)/m,于是当yi+1 = yi + 1时,xi+1 = xi + 1/m。根据此思想,可以写出DDA直线扫描转换算法的实现函数。
在CDraw类中添加如下成员函数用于实现DDA直线扫描转换算法:
public:
//DDA直线扫描转换算法
void DDALine(CDC* pDC, int x1, int y1, int x2,int y2,COLORREF color);
其中参数x1、y1、x2、y2是要绘制的直线段的两个端点的坐标;参数pDC是设备环境对象指针,我们需要绘制像素点;参数color为绘制直线段的颜色。实现代码如下:
//DDA直线扫描转换算法
void CDraw::DDALine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)
{
double dx,dy,e,x,y;
dx = x2 -x1;
dy = y2- y1;
e = (fabs(dx) fabs(dy)) ? f
您可能关注的文档
- 2011-2012学年高一生物必修1(苏教版)同步练习第二章第一节细胞中.doc
- 2012-2013高一上期末考试化学试题(实验荣誉).-深圳科学高中.doc
- 2012年3月份台南成大校友会登山健行社健行活动.doc
- 2011年高考试题解析地理之专题14中国地理-地理服务网.doc
- 2011年高考地理解题技巧及命题热点试题.ppt
- 2012年春季主要作物科学施肥技术指导意见(农业部测土配方施肥技术.doc
- 2012年夏季主要作物科学施肥指导意见-农业部.doc
- 2011年7月1.3常用酶切体系.ppt
- 2012年春季高考上海卷详解.doc
- 2012年秋冬季主要作物科学施肥指导意见-农业部.doc
文档评论(0)