- 19
- 0
- 约4.13万字
- 约 47页
- 2017-09-03 发布于天津
- 举报
图形基元扫描转换算法的实现
图形基元扫描转换算法的实现
目前,我们最常用的图形显示设备是光栅扫描式图形显示器,简称光栅显示器。光栅显示器是一种画点设备,它可以看作是一个像素点矩阵,每个像素可以用一种或多种的颜色显示,分别称为单色显示器或彩色显示器。在光栅显示器上显示的任何一种图形,实际上都是一些具有一种或多种颜色的像素的集合。例如,光栅显示器不能直接从像素矩阵中的一个像素画一条直线到另一个像素,只能用尽可能的靠近这条直线路径上的像素点集合来近似的表示这条直线。将要显示在光栅显示器上的图形描述转换成用像素点集合来表示的过程称为扫描转换。为了降低图形扫描转换的复杂度,我们往往将复杂图形分解成一些基本的简单图形的组合,这些基本图形称为图形基元。图形基元的选择可以有不同的方法,但是通常都会把线段、圆和多边形选为图形基元。本章将通过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
您可能关注的文档
- 网络版统计软件-浙江工会业务平台.doc
- 网络工程partone.ppt
- 网络安全的现状网络安全威胁网络安全策略网络安全体系.ppt
- 网络安全技术与协议-快猴网.ppt
- 王林祥打造智慧社区靠平台拼图-艾润物联.doc
- 王--能量之源光与光合作用全.ppt
- 万有引力理论的成就教学设计宁夏六盘山高级中学设计者赵保利.doc
- 万古霉素连续输注治疗革兰氏阳性菌感染与肾毒性的风险显着降低有关.doc
- 丸荣2h2d丸荣2h2d.pdf
- 外源核苷酸对大菱鲆幼鱼生长和溶菌酶活力的影响.pdf
- 《人工智能图像识别项目实践》课件 项目四 宠物管理猫狗检测.pdf
- 商务数据分析与应用 课件 12.1商务数据分析(高质量分析报告的撰写要求).pptx
- 数控编程与加工 课件 项目二 传动轴零件数控编程与加工.pptx
- 商务数据分析与应用 课件 10.1商务数据分析的价值(商品分析实战).pptx
- 《轨道作业车运用与规章》课件 项目5 《铁路技术管理规程(高速铁路部分)》考点解析.pptx
- M32CubeIDE嵌入式开发教程 课件 chap12DMA.pptx
- 数控编程与加工 课件 项目一 数控车床编程与操作基础.pptx
- 《轨道作业车运用与规章》课件 项目6-任务4 移动信号及手信号考点原文对照与案例解读.pptx
- 10.4 电能质量扰动分类结果分析.pptx
- M32CubeIDE嵌入式开发教程 课件 chap09实时时钟与定时器.pptx
原创力文档

文档评论(0)