图形基元扫描转换算法的实现.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图形基元扫描转换算法的实现

图形基元扫描转换算法的实现 目前,我们最常用的图形显示设备是光栅扫描式图形显示器,简称光栅显示器。光栅显示器是一种画点设备,它可以看作是一个像素点矩阵,每个像素可以用一种或多种的颜色显示,分别称为单色显示器或彩色显示器。在光栅显示器上显示的任何一种图形,实际上都是一些具有一种或多种颜色的像素的集合。例如,光栅显示器不能直接从像素矩阵中的一个像素画一条直线到另一个像素,只能用尽可能的靠近这条直线路径上的像素点集合来近似的表示这条直线。将要显示在光栅显示器上的图形描述转换成用像素点集合来表示的过程称为扫描转换。为了降低图形扫描转换的复杂度,我们往往将复杂图形分解成一些基本的简单图形的组合,这些基本图形称为图形基元。图形基元的选择可以有不同的方法,但是通常都会把线段、圆和多边形选为图形基元。本章将通过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

文档评论(0)

ailuojue + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档