基于MFC的图形图像处理方法(DOC)_第1页
基于MFC的图形图像处理方法(DOC)_第2页
基于MFC的图形图像处理方法(DOC)_第3页
基于MFC的图形图像处理方法(DOC)_第4页
基于MFC的图形图像处理方法(DOC)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于MFC的图形图像处理李明(08.2)20082006981 MFC平台的简单应用一 用C语言中自带的函数画点。其步骤如下:1. 建立一个工程:“文件”“新建”选中“”-” ”(在其中键入工程名称,如“TEST1”) (设置为自己想要存放的位置)“确定”“”“完成”“确定”。2. 左击“ ”即可出现所见工程中的所有类。若要实现画图功能,则必须要在其中的“”类中的“”函数中加入我们要实现功能所需要执行的代码。现在可以先后通过工具栏中的“”、“”按钮进行编译执行。其结果如下:图一图一为空白的,那是因为我们没有在“”函数中加任何代码。(每次编译执行时,应把“图一”所示界面关闭,否者进行编译执行会出错。)3. 利用C语言中自带的函数画一个点:双击“”-在函数“void CTEST1View:OnDraw(CDC* pDC)”提示的地方加上所要执行的代码,这里为:pDC-SetPixel(10,10,RGB(255,0,0);(该函数的前两个参数为所画点的位置坐标(x,y),第三个参数为其彩色值RGB三个分量各自的值)。经“”、“”后,其结果如下:图二可以看出所画此点极不清楚,我们可以自己编写一个画点函数。二 改进的画点函数。此方法的思想是:不只画出一个点P,同时也画出P附近的点。在图像中可看做显示一个像素及其领域中的像素。在这里以画出所有离P点水平和垂直距离均小于等于5的点为例。基于此思想,首先按照上一部分所说的“步骤1”建立一个工程“TEST2”,然后在“”函数中添加如下代码:for (int i=-5;i=5;i+)for (int j=-5;jSetPixel(10+i,10+j,RGB(255,0,0);经编译执行后可得:图三图二与图三相比,后者清楚了许多。这是因为图像是由许许多多的像素组成的,一个像素相对于整幅图来说是相当小的。故图二所画的一个点似乎是看不到的。三 利用C语言中的函数直接画线。如同前两部分,首先建立一个工程TEST3,然后在“”函数中执行如下命令:pDC-MoveTo(10,10);pDC-LineTo(100,100);经编译执行后就画出了一条从点(10,10)至点(100,100)的直线。所画直线如下图所示:图四2 生成直线的扫描转换算法一 生成直线的DDA算法。1.在计算机中画直线均是通过画离直线较近的整数点来实现的,如下图所示:图五2.直线DDA算法描述:设直线的解析式为y=mx+b即,且(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标.则可通过计算由x方向的增量x引起y的改变来生成直线:=+x(11)=m+b=m(+x)+b= xm(12)也可通过计算由y方向的增量y引起x的改变来生成直线:=y(13)=+(14)则当时,。(1-5)为了减少误差积累,仅当|m|1是采用(1-6)的方法。当|m|1时,应用时,的方法。(1-6)3:DDA算法的实现:建立工程TEST4。添加类Cline:右击“”“New Class” ”的属性为“”;“ ”为“CLine”“确定”。添加类Cline的成员:右击“” Add Member Variable” ”为“Cpoint”; “”为“point1”; “”“确定”。用同样的方法加一个成员变量point2。将Cline的数据成员初始化:双击“”通过“point1.x=0;point1.y=0;”将point1初始化。同样将point2初始化。添加类Cline的带参数的构造函数:在上一步的构造函数下面加上CLine:CLine(int x1,int y1,int x2,int y2)point1.x=x1;point1.y=y1;point2.x=x2;point2.y=y2;双击“”在“CLine();”后面加上“CLine(int x1,int y1,int x2,int y2);”在类Cline中增加函数void CLine:CLineddaplot(CDC *pDC):右击“”“Add Member Function”“”为“void”;“ ”为“CLineddaplot(CDC *pDC)”确定”双击函数“”添加基于DDA算法思想的画线函数代码。在“”函数中的相应:双击“”类中的“” 在“TEST4View.cpp”的前面加上#includeLine.h在void CTEST5View:OnDraw(CDC* pDC)提示的地方加入CLine line(10,10,40,50);line.CLineddaplot(pDC);对TEST4编译执行,便可用DDA算法画出一条如下图所示的从点(10,10)到点(40,50)的直线:图六4:DDA算法的优缺点:算法简单,容易实现;(1-5)、(1-6)里面含有浮点运算,实行起来较慢;而且由于画点时的四舍五入,会存在误差积累。二 生成直线的Bresenham算法。在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。它可以克服DDA算法中的一些不足。1:直线Bresenham算法描述:它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个像素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一个像素。我们首先讨论m=y/x,当0m1且x1d2,说明直线上理论点离(+1,+1)像素较近,下一个像素点应取(+1,+1)。(2)当此值为负时,d10,因此与(d1-d2)有相同的符号;这里y=y2-y1,m=y/x;c=2y+x(2b-1)。下面对式(2-4)作进一步处理,以便得出误差判别递推公式并消除常数c。将式(2-4)中的下标i改写成i+1,得到:=2y-2x+c(25)将式(2-5)减去(2-4),并利用,可得:= +2y-2x(-)(26)再假设直线的初始端点恰好是其像素点的坐标,即满足:y1=mx1+b(27)由式(2-4)和式(2-7)得到p1的初始值: p1=2y-x(28)这样,我们可利用误差判别变量,得到如下算法表示:初始 p1=2y-x(29)当0时:,,= +2(y-x)否则:, = +2y从式(2-9)可以看出,第i+1步的判别变量仅与第i步的判别变量、直线的两个端点坐标分量差x和y有关,运算中只含有整数相加和乘法运算,因此这个算法速度快并易于硬件实现。当m不在0m1里面是,直线可利用对称性画出。2: Bresenham算法的实现:建立一个工程TEST5,并添加如DDA算法中所示的类CLine且对其增加成员变量、初始化、并添加构造函数等。按照Bresenham算法的思想,在类Cline中增加函数void CLine:CLineBresenham(CDC *pDC)。在在void CTEST5View:OnDraw(CDC* pDC)函数中响应CLine line(10,10,40,50);line. CLineBresenham(pDC);也可画一条从(10,10)到点(40,50)的直线:图八3鼠标、 菜单、工具栏、对话框的人机交互一 通过左鼠标按下、抬起点分别作为起、终点画线。前面讲的画线方法都是指定起点和终点的坐标值,其实可以通过鼠标来确定直线的端点,不必知道其坐标值。例如可通过左鼠标按下、抬起点作为起点与终点来画线。1建立工程TEST6。2.由于要保存左鼠标按下的点,故要在类“”中增加一个全局变量:右击“”“Add Member Variable”其中“”为“CPoint”,” ”为“point1”,为了保证数据的安全性“”“”。3.建立相应函数 void CTEST6View:OnLButtonDown(UINT nFlags, CPoint point):“查看”“建立类向导”“”中将其对话框中的属性设置如下:(因为要画直线,故设置为视图类)双击“”中的“”(因为要利用做鼠标点下的点作为所画直线的起点)点击此对话框中的“”按钮,即可进入编写函数状态。在函数void CTEST4View:OnLButtonDown(UINT nFlags, CPoint point)中写入:point1=point;/ 将鼠标点下的点存到point1中1. 如上一步所示,只是将“”改为“”便可建立响应函数void CTEST4View:OnLButtonUp(UINT nFlags, CPoint point),在里面加入代码CDC *pDC=GetDC();/ 此函数用来生成一个CDC类的指针,以便调用里面的画点函数pDC-SetPixel();pDC-MoveTo(point1);pDC-LineTo(point);pDC-DeleteDC();/ 为了保持内存,要将建立的指针删除掉4为了更好的人机交互,可在“”函数中加入如下命令:pDC-TextOut(10,10,通过左鼠标按下、抬起点分别作为起、终点画线);对TEST4编译、执行结果如下:图九二 通过菜单建立人际交互(本部分操作均在工程TEST6内进行,并将前面建立的类CLine与DDA、Bresenham算法的函数都加在里面)建立菜单:单击“”双击“”中的“”在里面添加一个新的菜单“CLine”及子菜单“DDA”与“Bresenham”。更改菜单的属性:右击“DDA”菜单”属性”将其ID设为” ”(以便明了的知道其所要执行的操作)。同样将菜单“Bresenham”的ID设为“”。为了使单击“DDA”时,用DDA方法画线,单击“Bresenham”时用Bresenham方法画线。可以在类“”中增加两个bool类型的变量m_bDDA和m_bBresenham,并在函数“”“”中将此两个变量初始化(m_bDDA=false;m_bBresenham=false;)。增加响应函数void CTEST6View:OnDDA():右击子菜单“DDA”建立类向导”设置为“”双击“”中的“”-双击“”中的“”将“”改为“OnDDA”OK” 点击“”增加相应函数:m_bDDA=true;m_bBresenham=false;Invalidate();/重新调用画图函数OnDraw(CDC *pDC)用类似的方法菜单“Bresenham”的建立响应函数。但要在其中加入的代码是:m_bBresenham=true;m_bDDA=false;Invalidate();/重新调用画图函数OnDraw(CDC *pDC)在函数“”添加CLine line(10,10,40,50);if (m_bDDA=true)line.CLineddaplot(pDC);else if (m_bBresenham=true)line. CLineBresenham(pDC);采用上述方法便可以实现单击“DDA”时,用DDA方法画线,单击“Bresenham”时用Bresenham方法画线的功能。三 通过工具栏建立人机交互(本部分操作在工程TEST6内进行)添加工具按钮“”:单击“”双击” ”里面的“”在“”中画一条直线即可。双击“”设置其ID为“ID_DDA”(与菜单“DDA”的相同),单击此按钮即可用DDA方法画线;设置“”的ID为“ID_BRESENHAM”(与菜单“Bresenham”的相同),单击此按钮即可用Bresenham方法画线。图十四 通过对话框建立人际交互(本部分操作在工程TEST6内进行)上面的交互方式均不能画出在给定精确的起、终点坐标后的直线,但通过对画框便可以实现这种功能。方法如下:添加对话框:单击“”右击“ ”“插入Dialog”选中此对话框后右击“属性”将其ID设置为“IDD_LINEPARADLG”;” ”设置为“LineParaDialog”选中“”中的“”。建立一个新的类CLinePARADlg:选中所建立的对话框后并右击“建立类向导”“”OK” ”为“CLinePARADlg”OK”确定”。加入静态文字:单击“控件”中的“”后即可在“对话框”中拖出一个静态文本在其“属性“中将“”设置为“Input the end of line”。类似的可在对话框中加入四个静态文本框、四个“编辑框”“ “并将其编辑框的ID分别设置为“IDC_X1” “IDC_Y1” “IDC_X2” “IDC_Y2”。增加变量:右击第一个“编辑”框“建立类向导” ”双击“” ”为“m_nX1”;” ”设置为“int”OK”。同样可添加其他三个变量Y1,X2,Y2。初始对话框:选中建立的对话框并右击”建立类向导” “ ” ”为“ ”;“”中双击“” ”。在函数里面加入m_nX1=0;m_nY1=0;m_nX2=0;m_nY2=0;跟对话框建立消息响应函数:建立工具栏按钮“”(其ID为ID_LINE)并将其选中”左击” ”建立类向导” ”为“”;“Object IDs”为“ID_LINE”双击“” “ OnLINE” ”。在函数中加入CLinePARADlg lineparadlg;lineparadlg.DoModal();int x1=lineparadlg.m_nX1;int y1=lineparadlg.m_nY1;int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论