基于MFC的圖形圖像處理方法_第1頁(yè)
基于MFC的圖形圖像處理方法_第2頁(yè)
基于MFC的圖形圖像處理方法_第3頁(yè)
基于MFC的圖形圖像處理方法_第4頁(yè)
基于MFC的圖形圖像處理方法_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

PAGEPAGE4基于MFC的圖形圖像處理——李明(08.2)2008200698§1MFC平臺(tái)的簡(jiǎn)單應(yīng)用一用C語(yǔ)言中自帶的函數(shù)畫(huà)點(diǎn)。其步驟如下:建立一個(gè)工程:“文件”——>“新建”——>選中“”-——>””(在其中鍵入工程名稱(chēng),如“TEST1”)——>(設(shè)置為自己想要存放的位置)——>“確定”——>“”——>“完成”——>“確定”。左擊“”即可出現(xiàn)所見(jiàn)工程中的所有類(lèi)。若要實(shí)現(xiàn)畫(huà)圖功能,則必須要在其中的“”類(lèi)中的“”函數(shù)中加入我們要實(shí)現(xiàn)功能所需要執(zhí)行的代碼?,F(xiàn)在可以先后通過(guò)工具欄中的“”、“”按鈕進(jìn)行編譯執(zhí)行。其結(jié)果如下:圖一圖一為空白的,那是因?yàn)槲覀儧](méi)有在“”函數(shù)中加任何代碼。(每次編譯執(zhí)行時(shí),應(yīng)把“圖一”所示界面關(guān)閉,否者進(jìn)行編譯執(zhí)行會(huì)出錯(cuò)。)利用C語(yǔ)言中自帶的函數(shù)畫(huà)一個(gè)點(diǎn):雙擊“”->在函數(shù)“voidCTEST1View::OnDraw(CDC*pDC)”提示的地方加上所要執(zhí)行的代碼,這里為:pDC->SetPixel(10,10,RGB(255,0,0));(該函數(shù)的前兩個(gè)參數(shù)為所畫(huà)點(diǎn)的位置坐標(biāo)(x,y),第三個(gè)參數(shù)為其彩色值RGB三個(gè)分量各自的值)。經(jīng)“”、“”后,其結(jié)果如下:圖二可以看出所畫(huà)此點(diǎn)極不清楚,我們可以自己編寫(xiě)一個(gè)畫(huà)點(diǎn)函數(shù)。二改進(jìn)的畫(huà)點(diǎn)函數(shù)。此方法的思想是:不只畫(huà)出一個(gè)點(diǎn)P,同時(shí)也畫(huà)出P附近的點(diǎn)。在圖像中可看做顯示一個(gè)像素及其領(lǐng)域中的像素。在這里以畫(huà)出所有離P點(diǎn)水平和垂直距離均小于等于5的點(diǎn)為例。基于此思想,首先按照上一部分所說(shuō)的“步驟1”建立一個(gè)工程“TEST2”,然后在“”函數(shù)中添加如下代碼: for(inti=-5;i<=5;i++) { for(intj=-5;j<=5;j++) { pDC->SetPixel(10+i,10+j,RGB(255,0,0)); } } 經(jīng)編譯執(zhí)行后可得:圖三圖二與圖三相比,后者清楚了許多。這是因?yàn)閳D像是由許許多多的像素組成的,一個(gè)像素相對(duì)于整幅圖來(lái)說(shuō)是相當(dāng)小的。故圖二所畫(huà)的一個(gè)點(diǎn)似乎是看不到的。三利用C語(yǔ)言中的函數(shù)直接畫(huà)線。如同前兩部分,首先建立一個(gè)工程TEST3,然后在“”函數(shù)中執(zhí)行如下命令:pDC->MoveTo(10,10); pDC->LineTo(100,100);經(jīng)編譯執(zhí)行后就畫(huà)出了一條從點(diǎn)(10,10)至點(diǎn)(100,100)的直線。所畫(huà)直線如下圖所示:圖六4:DDA算法的優(yōu)缺點(diǎn):算法簡(jiǎn)單,容易實(shí)現(xiàn);(1-5)、(1-6)里面含有浮點(diǎn)運(yùn)算,實(shí)行起來(lái)較慢;而且由于畫(huà)點(diǎn)時(shí)的四舍五入,會(huì)存在誤差積累。二生成直線的Bresenham算法。在生成直線的算法中,Bresenham算法是最有效的算法之一。Bresenham算法是一種基于誤差判別式來(lái)生成直線的方法。它可以克服DDA算法中的一些不足。1:直線Bresenham算法描述:它也是采用遞推步進(jìn)的辦法,令每次最大變化方向的坐標(biāo)步進(jìn)一個(gè)像素,同時(shí)另一個(gè)方向的坐標(biāo)依據(jù)誤差判別式的符號(hào)來(lái)決定是否也要步進(jìn)一個(gè)像素。我們首先討論m=△y/△x,當(dāng)0≤m≤1且x1<x2時(shí)的Bresenham算法。從DDA直線算法可知這些條件成立時(shí),公式當(dāng)時(shí),。 (1-5)成立。由于顯示直線的像素只能取整數(shù)值坐標(biāo),可以假設(shè)直線上第i個(gè)像素點(diǎn)坐標(biāo)為(,),它是直線上點(diǎn)(,y)的最佳近似,如下圖所示。那么,直線上下一個(gè)像點(diǎn)的可能位置是(,)或(,+1)。圖七由圖七可以知道,在x=+1處,直線上點(diǎn)的y值是y=m(+1)+b,該點(diǎn)離像素素點(diǎn)(+1,)和象素點(diǎn)(+1,+1)的距離分別是d1和d2:d1=y-=m(+1)+b-(2-1)d2=(+1)-y=(+1)-m(+1)-b(2-2)這兩個(gè)距離差是d1-d2=2m(+1)-2+2b-1(2-3)

我們來(lái)分析公式(2-3):

(1)當(dāng)此值為正時(shí),d1>d2,說(shuō)明直線上理論點(diǎn)離(+1,+1)像素較近,下一個(gè)像素點(diǎn)應(yīng)取(+1,+1)。(2)當(dāng)此值為負(fù)時(shí),d1<d2,說(shuō)明直線上理論點(diǎn)離(+1,)象素較近,則下一個(gè)象素點(diǎn)應(yīng)取(+1,)。(3)當(dāng)此值為零時(shí),說(shuō)明直線上理論點(diǎn)離上、下兩個(gè)像素點(diǎn)的距離相等,取哪個(gè)點(diǎn)都行,假設(shè)算法規(guī)定這種情況下取(+1,+1)作為下一個(gè)像素點(diǎn)。這樣正好與我們計(jì)算時(shí)采用四舍五入的思想相一致。因此只要利用(d1-d2)的符號(hào)就可以決定下一個(gè)像素點(diǎn)的選擇。為此,我們進(jìn)一步定義一個(gè)新的判別式:=△x×(d1-d2)=2△y·-2△x·+c(2-4)

式(2-4)中的△x=(x2-x1)>0,因此與(d1-d2)有相同的符號(hào);這里△y=y2-y1,m=△y/△x;c=2△y+△x(2b-1)。下面對(duì)式(2-4)作進(jìn)一步處理,以便得出誤差判別遞推公式并消除常數(shù)c。將式(2-4)中的下標(biāo)i改寫(xiě)成i+1,得到:=2△y·-2△x·+c(2-5)將式(2-5)減去(2-4),并利用,可得:=+2△y-2△x·(-)(2-6)再假設(shè)直線的初始端點(diǎn)恰好是其像素點(diǎn)的坐標(biāo),即滿(mǎn)足:y1=mx1+b(2-7)由式(2-4)和式(2-7)得到p1的初始值:p1=2△y-△x(2-8)這樣,我們可利用誤差判別變量,得到如下算法表示:初始p1=2△y-△x(2-9)當(dāng)≥0時(shí):,

=+2(△y-△x)否則:

,

=+2△y

從式(2-9)可以看出,第i+1步的判別變量?jī)H與第i步的判別變量、直線的兩個(gè)端點(diǎn)坐標(biāo)分量差△x和△y有關(guān),運(yùn)算中只含有整數(shù)相加和乘法運(yùn)算,因此這個(gè)算法速度快并易于硬件實(shí)現(xiàn)。當(dāng)m不在{0≤m≤1}里面是,直線可利用對(duì)稱(chēng)性畫(huà)出。2:Bresenham算法的實(shí)現(xiàn):建立一個(gè)工程TEST5,并添加如DDA算法中所示的類(lèi)CLine且對(duì)其增加成員變量、初始化、并添加構(gòu)造函數(shù)等。按照Bresenham算法的思想,在類(lèi)Cline中增加函數(shù)voidCLine::CLineBresenham(CDC*pDC)。在在voidCTEST5View::OnDraw(CDC*pDC)函數(shù)中響應(yīng)CLineline(10,10,40,50); line.CLineBresenham(pDC);也可畫(huà)一條從(10,10)到點(diǎn)(40,50)的直線:圖八§3鼠標(biāo)、菜單、工具欄、對(duì)話框的人機(jī)交互一通過(guò)左鼠標(biāo)按下、抬起點(diǎn)分別作為起、終點(diǎn)畫(huà)線。前面講的畫(huà)線方法都是指定起點(diǎn)和終點(diǎn)的坐標(biāo)值,其實(shí)可以通過(guò)鼠標(biāo)來(lái)確定直線的端點(diǎn),不必知道其坐標(biāo)值。例如可通過(guò)左鼠標(biāo)按下、抬起點(diǎn)作為起點(diǎn)與終點(diǎn)來(lái)畫(huà)線。1建立工程TEST6。2.由于要保存左鼠標(biāo)按下的點(diǎn),故要在類(lèi)“”中增加一個(gè)全局變量:右擊“”——>“AddMemberVariable…”——>其中“”為“CPoint”,””為“point1”,為了保證數(shù)據(jù)的安全性“”——>“”。3.建立相應(yīng)函數(shù)voidCTEST6View::OnLButtonDown(UINTnFlags,CPointpoint):“查看”——>“建立類(lèi)向?qū)А薄?gt;“”中將其對(duì)話框中的屬性設(shè)置如下:(因?yàn)橐?huà)直線,故設(shè)置為視圖類(lèi))——>雙擊“”中的“”(因?yàn)橐米鍪髽?biāo)點(diǎn)下的點(diǎn)作為所畫(huà)直線的起點(diǎn))——>點(diǎn)擊此對(duì)話框中的“”按鈕,即可進(jìn)入編寫(xiě)函數(shù)狀態(tài)。在函數(shù)voidCTEST4View::OnLButtonDown(UINTnFlags,CPointpoint)中寫(xiě)入:point1=point;//將鼠標(biāo)點(diǎn)下的點(diǎn)存到point1中如上一步所示,只是將“”改為“”便可建立響應(yīng)函數(shù)voidCTEST4View::OnLButtonUp(UINTnFlags,CPointpoint),在里面加入代碼CDC*pDC=GetDC();//此函數(shù)用來(lái)生成一個(gè)CDC類(lèi)的指針,以便調(diào)用里面的畫(huà)點(diǎn)函數(shù)pDC->SetPixel();pDC->MoveTo(point1);pDC->LineTo(point); pDC->DeleteDC();//為了保持內(nèi)存,要將建立的指針刪除掉4.為了更好的人機(jī)交互,可在“”函數(shù)中加入如下命令:pDC->TextOut(10,10,"通過(guò)左鼠標(biāo)按下、抬起點(diǎn)分別作為起、終點(diǎn)畫(huà)線");對(duì)TEST4編譯、執(zhí)行結(jié)果如下:圖九 二通過(guò)菜單建立人際交互(本部分操作均在工程TEST6內(nèi)進(jìn)行,并將前面建立的類(lèi)CLine與DDA、Bresenham算法的函數(shù)都加在里面)=1\*GB3①建立菜單:?jiǎn)螕簟啊薄?gt;雙擊“”中的“”——>在里面添加一個(gè)新的菜單“CLine”及子菜單“DDA”與“Bresenham”。=2\*GB3②更改菜單的屬性:右擊“DDA”菜單——>”屬性”——>將其ID設(shè)為””(以便明了的知道其所要執(zhí)行的操作)。同樣將菜單“Bresenham”的ID設(shè)為“”。=3\*GB3③為了使單擊“DDA”時(shí),用DDA方法畫(huà)線,單擊“Bresenham”時(shí)用Bresenham方法畫(huà)線??梢栽陬?lèi)“”中增加兩個(gè)bool類(lèi)型的變量m_bDDA和m_bBresenham,并在函數(shù)“”“”中將此兩個(gè)變量初始化(m_bDDA=false;m_bBresenham=false;)。=4\*GB3④增加響應(yīng)函數(shù)voidCTEST6View::OnDDA():右擊子菜單“DDA”——>”建立類(lèi)向?qū)А薄?gt;””設(shè)置為“”——>雙擊“”中的“”-——>雙擊“”中的“”——>將“”改為“OnDDA”——>”O(jiān)K”——>點(diǎn)擊“”增加相應(yīng)函數(shù):m_bDDA=true; m_bBresenham=false; Invalidate();//重新調(diào)用畫(huà)圖函數(shù)OnDraw(CDC*pDC)用類(lèi)似的方法菜單“Bresenham”的建立響應(yīng)函數(shù)。但要在其中加入的代碼是:m_bBresenham=true; m_bDDA=false; Invalidate();//重新調(diào)用畫(huà)圖函數(shù)OnDraw(CDC*pDC)=5\*GB3⑤在函數(shù)“”添加CLineline(10,10,40,50); if(m_bDDA==true) { line.CLineddaplot(pDC); } elseif(m_bBresenham==true) { line.CLineBresenham(pDC); }采用上述方法便可以實(shí)現(xiàn)單擊“DDA”時(shí),用DDA方法畫(huà)線,單擊“Bresenham”時(shí)用Bresenham方法畫(huà)線的功能。三通過(guò)工具欄建立人機(jī)交互(本部分操作在工程TEST6內(nèi)進(jìn)行)=1\*GB3①添加工具按鈕“”:?jiǎn)螕簟啊薄?gt;雙擊””里面的“”——>在“”中畫(huà)一條直線即可。=2\*GB3②雙擊“”設(shè)置其ID為“ID_DDA”(與菜單“DDA”的相同),單擊此按鈕即可用DDA方法畫(huà)線;設(shè)置“”的ID為“ID_BRESENHAM”(與菜單“Bresenham”的相同),單擊此按鈕即可用Bresenham方法畫(huà)線。圖十四通過(guò)對(duì)話框建立人際交互(本部分操作在工程TEST6內(nèi)進(jìn)行)上面的交互方式均不能畫(huà)出在給定精確的起、終點(diǎn)坐標(biāo)后的直線,但通過(guò)對(duì)畫(huà)框便可以實(shí)現(xiàn)這種功能。方法如下:=1\*GB3①添加對(duì)話框:?jiǎn)螕簟啊薄?gt;右擊“”——>“插入Dialog”——>選中此對(duì)話框后右擊——>“屬性”——>將其ID設(shè)置為“IDD_LINEPARADLG”;””設(shè)置為“LineParaDialog”——>選中“”中的“”。=2\*GB3②建立一個(gè)新的類(lèi)CLinePARADlg:選中所建立的對(duì)話框后并右擊——>“建立類(lèi)向?qū)А薄?gt;“”——>”O(jiān)K”——>””為“CLinePARADlg”——>”O(jiān)K”——>” 確定”。=3\*GB3③加入靜態(tài)文字:?jiǎn)螕簟翱丶敝械摹啊焙蠹纯稍凇皩?duì)話框”中拖出一個(gè)靜態(tài)文本——>在其“屬性“中將“”設(shè)置為“Inputtheendofline”。類(lèi)似的可在對(duì)話框中加入四個(gè)靜態(tài)文本框、四個(gè)“編輯框”——““并將其編輯框的ID分別設(shè)置為“IDC_X1”“IDC_Y1”“IDC_X2”“IDC_Y2”。=4\*GB3④增加變量:右擊第一個(gè)“編輯”框——>“建立類(lèi)向?qū)А薄?gt;””——>雙擊“”——>””為“m_nX1”;””設(shè)置為“int”——>”O(jiān)K”。同樣可添加其他三個(gè)變量Y1,X2,Y2。=5\*GB3⑤初始對(duì)話框:選中建立的對(duì)話框并右擊——>”建立類(lèi)向?qū)А薄?gt;“”——>””——>”為“”;“”中雙擊“”——>””。在函數(shù)里面加入 m_nX1=0; m_nY1=0; m_nX2=0; m_nY2=0;=6\*GB3⑥跟對(duì)話框建立消息響應(yīng)函數(shù):建立工具欄按鈕“”(其ID為ID_LINE)并將其選中”——>左擊””——>”建立類(lèi)向?qū)А薄?gt;””為“”;“ObjectIDs”為“ID_LINE”——>雙擊“”——>“OnLINE”——>””。在函數(shù)中加入CLinePARADlglineparadlg; lineparadlg.DoModal(); intx1=lineparadlg.m_nX1; inty1=lineparadlg.m_nY1; intx2=li

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論