版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE4基于MFC的图形图像处理——李明(08.2)2008200698§1MFC平台的简单应用一用C语言中自带的函数画点。其步骤如下:建立一个工程:“文件”——>“新建”——>选中“”-——>””(在其中键入工程名称,如“TEST1”)——>(设置为自己想要存放的位置)——>“确定”——>“”——>“完成”——>“确定”。左击“”即可出现所见工程中的所有类。若要实现画图功能,则必须要在其中的“”类中的“”函数中加入我们要实现功能所需要执行的代码。现在可以先后通过工具栏中的“”、“”按钮进行编译执行。其结果如下:图一图一为空白的,那是因为我们没有在“”函数中加任何代码。(每次编译执行时,应把“图一”所示界面关闭,否者进行编译执行会出错。)利用C语言中自带的函数画一个点:双击“”->在函数“voidCTEST1View::OnDraw(CDC*pDC)”提示的地方加上所要执行的代码,这里为:pDC->SetPixel(10,10,RGB(255,0,0));(该函数的前两个参数为所画点的位置坐标(x,y),第三个参数为其彩色值RGB三个分量各自的值)。经“”、“”后,其结果如下:图二可以看出所画此点极不清楚,我们可以自己编写一个画点函数。二改进的画点函数。此方法的思想是:不只画出一个点P,同时也画出P附近的点。在图像中可看做显示一个像素及其领域中的像素。在这里以画出所有离P点水平和垂直距离均小于等于5的点为例。基于此思想,首先按照上一部分所说的“步骤1”建立一个工程“TEST2”,然后在“”函数中添加如下代码: for(inti=-5;i<=5;i++) { for(intj=-5;j<=5;j++) { pDC->SetPixel(10+i,10+j,RGB(255,0,0)); } } 经编译执行后可得:图三图二与图三相比,后者清楚了许多。这是因为图像是由许许多多的像素组成的,一个像素相对于整幅图来说是相当小的。故图二所画的一个点似乎是看不到的。三利用C语言中的函数直接画线。如同前两部分,首先建立一个工程TEST3,然后在“”函数中执行如下命令:pDC->MoveTo(10,10); pDC->LineTo(100,100);经编译执行后就画出了一条从点(10,10)至点(100,100)的直线。所画直线如下图所示:图六4:DDA算法的优缺点:算法简单,容易实现;(1-5)、(1-6)里面含有浮点运算,实行起来较慢;而且由于画点时的四舍五入,会存在误差积累。二生成直线的Bresenham算法。在生成直线的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一种基于误差判别式来生成直线的方法。它可以克服DDA算法中的一些不足。1:直线Bresenham算法描述:它也是采用递推步进的办法,令每次最大变化方向的坐标步进一个像素,同时另一个方向的坐标依据误差判别式的符号来决定是否也要步进一个像素。我们首先讨论m=△y/△x,当0≤m≤1且x1<x2时的Bresenham算法。从DDA直线算法可知这些条件成立时,公式当时,。 (1-5)成立。由于显示直线的像素只能取整数值坐标,可以假设直线上第i个像素点坐标为(,),它是直线上点(,y)的最佳近似,如下图所示。那么,直线上下一个像点的可能位置是(,)或(,+1)。图七由图七可以知道,在x=+1处,直线上点的y值是y=m(+1)+b,该点离像素素点(+1,)和象素点(+1,+1)的距离分别是d1和d2:d1=y-=m(+1)+b-(2-1)d2=(+1)-y=(+1)-m(+1)-b(2-2)这两个距离差是d1-d2=2m(+1)-2+2b-1(2-3)
我们来分析公式(2-3):
(1)当此值为正时,d1>d2,说明直线上理论点离(+1,+1)像素较近,下一个像素点应取(+1,+1)。(2)当此值为负时,d1<d2,说明直线上理论点离(+1,)象素较近,则下一个象素点应取(+1,)。(3)当此值为零时,说明直线上理论点离上、下两个像素点的距离相等,取哪个点都行,假设算法规定这种情况下取(+1,+1)作为下一个像素点。这样正好与我们计算时采用四舍五入的思想相一致。因此只要利用(d1-d2)的符号就可以决定下一个像素点的选择。为此,我们进一步定义一个新的判别式:=△x×(d1-d2)=2△y·-2△x·+c(2-4)
式(2-4)中的△x=(x2-x1)>0,因此与(d1-d2)有相同的符号;这里△y=y2-y1,m=△y/△x;c=2△y+△x(2b-1)。下面对式(2-4)作进一步处理,以便得出误差判别递推公式并消除常数c。将式(2-4)中的下标i改写成i+1,得到:=2△y·-2△x·+c(2-5)将式(2-5)减去(2-4),并利用,可得:=+2△y-2△x·(-)(2-6)再假设直线的初始端点恰好是其像素点的坐标,即满足:y1=mx1+b(2-7)由式(2-4)和式(2-7)得到p1的初始值:p1=2△y-△x(2-8)这样,我们可利用误差判别变量,得到如下算法表示:初始p1=2△y-△x(2-9)当≥0时:,
,
=+2(△y-△x)否则:
,
=+2△y
从式(2-9)可以看出,第i+1步的判别变量仅与第i步的判别变量、直线的两个端点坐标分量差△x和△y有关,运算中只含有整数相加和乘法运算,因此这个算法速度快并易于硬件实现。当m不在{0≤m≤1}里面是,直线可利用对称性画出。2:Bresenham算法的实现:建立一个工程TEST5,并添加如DDA算法中所示的类CLine且对其增加成员变量、初始化、并添加构造函数等。按照Bresenham算法的思想,在类Cline中增加函数voidCLine::CLineBresenham(CDC*pDC)。在在voidCTEST5View::OnDraw(CDC*pDC)函数中响应CLineline(10,10,40,50); line.CLineBresenham(pDC);也可画一条从(10,10)到点(40,50)的直线:图八§3鼠标、菜单、工具栏、对话框的人机交互一通过左鼠标按下、抬起点分别作为起、终点画线。前面讲的画线方法都是指定起点和终点的坐标值,其实可以通过鼠标来确定直线的端点,不必知道其坐标值。例如可通过左鼠标按下、抬起点作为起点与终点来画线。1建立工程TEST6。2.由于要保存左鼠标按下的点,故要在类“”中增加一个全局变量:右击“”——>“AddMemberVariable…”——>其中“”为“CPoint”,””为“point1”,为了保证数据的安全性“”——>“”。3.建立相应函数voidCTEST6View::OnLButtonDown(UINTnFlags,CPointpoint):“查看”——>“建立类向导”——>“”中将其对话框中的属性设置如下:(因为要画直线,故设置为视图类)——>双击“”中的“”(因为要利用做鼠标点下的点作为所画直线的起点)——>点击此对话框中的“”按钮,即可进入编写函数状态。在函数voidCTEST4View::OnLButtonDown(UINTnFlags,CPointpoint)中写入:point1=point;//将鼠标点下的点存到point1中如上一步所示,只是将“”改为“”便可建立响应函数voidCTEST4View::OnLButtonUp(UINTnFlags,CPointpoint),在里面加入代码CDC*pDC=GetDC();//此函数用来生成一个CDC类的指针,以便调用里面的画点函数pDC->SetPixel();pDC->MoveTo(point1);pDC->LineTo(point); pDC->DeleteDC();//为了保持内存,要将建立的指针删除掉4.为了更好的人机交互,可在“”函数中加入如下命令:pDC->TextOut(10,10,"通过左鼠标按下、抬起点分别作为起、终点画线");对TEST4编译、执行结果如下:图九 二通过菜单建立人际交互(本部分操作均在工程TEST6内进行,并将前面建立的类CLine与DDA、Bresenham算法的函数都加在里面)=1\*GB3①建立菜单:单击“”——>双击“”中的“”——>在里面添加一个新的菜单“CLine”及子菜单“DDA”与“Bresenham”。=2\*GB3②更改菜单的属性:右击“DDA”菜单——>”属性”——>将其ID设为””(以便明了的知道其所要执行的操作)。同样将菜单“Bresenham”的ID设为“”。=3\*GB3③为了使单击“DDA”时,用DDA方法画线,单击“Bresenham”时用Bresenham方法画线。可以在类“”中增加两个bool类型的变量m_bDDA和m_bBresenham,并在函数“”“”中将此两个变量初始化(m_bDDA=false;m_bBresenham=false;)。=4\*GB3④增加响应函数voidCTEST6View::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)=5\*GB3⑤在函数“”添加CLineline(10,10,40,50); if(m_bDDA==true) { line.CLineddaplot(pDC); } elseif(m_bBresenham==true) { line.CLineBresenham(pDC); }采用上述方法便可以实现单击“DDA”时,用DDA方法画线,单击“Bresenham”时用Bresenham方法画线的功能。三通过工具栏建立人机交互(本部分操作在工程TEST6内进行)=1\*GB3①添加工具按钮“”:单击“”——>双击””里面的“”——>在“”中画一条直线即可。=2\*GB3②双击“”设置其ID为“ID_DDA”(与菜单“DDA”的相同),单击此按钮即可用DDA方法画线;设置“”的ID为“ID_BRESENHAM”(与菜单“Bresenham”的相同),单击此按钮即可用Bresenham方法画线。图十四通过对话框建立人际交互(本部分操作在工程TEST6内进行)上面的交互方式均不能画出在给定精确的起、终点坐标后的直线,但通过对画框便可以实现这种功能。方法如下:=1\*GB3①添加对话框:单击“”——>右击“”——>“插入Dialog”——>选中此对话框后右击——>“属性”——>将其ID设置为“IDD_LINEPARADLG”;””设置为“LineParaDialog”——>选中“”中的“”。=2\*GB3②建立一个新的类CLinePARADlg:选中所建立的对话框后并右击——>“建立类向导”——>“”——>”OK”——>””为“CLinePARADlg”——>”OK”——>” 确定”。=3\*GB3③加入静态文字:单击“控件”中的“”后即可在“对话框”中拖出一个静态文本——>在其“属性“中将“”设置为“Inputtheendofline”。类似的可在对话框中加入四个静态文本框、四个“编辑框”——““并将其编辑框的ID分别设置为“IDC_X1”“IDC_Y1”“IDC_X2”“IDC_Y2”。=4\*GB3④增加变量:右击第一个“编辑”框——>“建立类向导”——>””——>双击“”——>””为“m_nX1”;””设置为“int”——>”OK”。同样可添加其他三个变量Y1,X2,Y2。=5\*GB3⑤初始对话框:选中建立的对话框并右击——>”建立类向导”——>“”——>””——>”为“”;“”中双击“”——>””。在函数里面加入 m_nX1=0; m_nY1=0; m_nX2=0; m_nY2=0;=6\*GB3⑥跟对话框建立消息响应函数:建立工具栏按钮“”(其ID为ID_LINE)并将其选中”——>左击””——>”建立类向导”——>””为“”;“ObjectIDs”为“ID_LINE”——>双击“”——>“OnLINE”——>””。在函数中加入CLinePARADlglineparadlg; lineparadlg.DoModal(); intx1=lineparadlg.m_nX1; inty1=lineparadlg.m_nY1; intx2=li
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026经济双循环面试题及答案
- 2026年度预算面试题目及答案
- 2026人寿保险面试题目及答案
- 2026深圳医院口腔面试题目及答案
- 医院医疗机构廉洁行医制度(范本)
- 年产110万张加工胶木单板项目可行性研究报告模板-申批备案
- (2025年)临床三基考试试题及答案
- 2026年《静脉治疗护理技术操作标准解读》培训考试试卷附答案
- 2026年全国工会知识竞赛试题及答案
- 2026年继续教育公需科目考试试题与答案
- 2026福建省农业融资担保有限公司招聘3人笔试备考题库及答案详解
- 抽水蓄能电站爆破施工方案
- 2026-2030中国钇行业运行现状与投资前景预测分析报告
- 2026年钛材行业分析报告及未来发展趋势报告
- 2026年重症肺炎的诊断与治疗
- 从零开始学量价分析(短线操盘-盘口分析与A股买卖点实战)
- 水利行业从业人员安全培训手册
- 重卡维修站规范制度
- 心电图机操作课件
- 泌尿外科考试试卷及答案
- GB/T 16783.1-2025石油天然气工业钻井液现场测试第1部分:水基钻井液
评论
0/150
提交评论