一編程實(shí)現(xiàn)直線段的裁剪算法_第1頁(yè)
一編程實(shí)現(xiàn)直線段的裁剪算法_第2頁(yè)
一編程實(shí)現(xiàn)直線段的裁剪算法_第3頁(yè)
一編程實(shí)現(xiàn)直線段的裁剪算法_第4頁(yè)
一編程實(shí)現(xiàn)直線段的裁剪算法_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)一編程實(shí)現(xiàn)直線段的裁剪算法課程名稱:圖形學(xué)任課老師謝伙牛老師年級(jí)03級(jí)班級(jí)計(jì)算機(jī)(6)班姓名沈睿汀學(xué)號(hào)S030300833博誠(chéng)一、實(shí)驗(yàn)要求1、裁剪算法選用Cohen-Sutherland算法;2、界面設(shè)計(jì)友好、直觀。二、實(shí)驗(yàn)環(huán)境說(shuō)明(1) 本系統(tǒng)基于 JAVA 編程環(huán)境,使用 JBuilder X 作為相關(guān)的開(kāi)發(fā)工具,因此 系統(tǒng)的運(yùn)行與其它用 VC+ 開(kāi)發(fā)的系統(tǒng)略有不同。(2) 在 WINDOWS-XP 下 運(yùn) 行 本 程 序 的 時(shí) 候 , 請(qǐng) 先 安 裝 j2re-1_4_2_04-windows-i586-p.exe然后,才能正常運(yùn)行, windows 環(huán)境下雙擊 030300833

2、Cutline.exe。三、算法與數(shù)據(jù)結(jié)構(gòu)(程序設(shè)計(jì))核心算法Cohen-Sutherland的編寫(xiě)過(guò)程如下(在Sutherland.java文件中可以看 到具體代碼 ):(1) 新建一個(gè)類(lèi)Sutherland,并在類(lèi)在聲明一個(gè)構(gòu)造函數(shù) Sutherland(int wyt, int wyb, int wxl, int wxr) ,傳遞矩形的四個(gè)邊界參數(shù),并對(duì)類(lèi)中的共有屬性進(jìn)行 初始化。( 2)聲明一個(gè)端點(diǎn)編碼方法 private void codingPoint(int x, int y, int p) ,根據(jù) 書(shū)上的編碼規(guī)則對(duì)端點(diǎn)進(jìn)行編碼。( 3)聲明一個(gè)方法 public void se

3、tPoint(int x1, int y1, int x2, int y2) 來(lái)設(shè)置直線 段的兩端點(diǎn)坐標(biāo)。( 4)聲明兩個(gè)方法 private int OR(int op1, int op2) 和 private int AND(int op1, int op2) 來(lái)分別 實(shí)現(xiàn)編碼后的 端點(diǎn)的 相或和相與。 并編寫(xiě) 一個(gè)方法 isInWindow(int op) 來(lái)判斷點(diǎn) op 是否在窗口中。( 5)編寫(xiě)兩個(gè)方法 private int caculateY(int x1, int y1, int x2, int y2, int x) 和 private int caculateX(int x1

4、, int y1, int x2, int y2, int y) 來(lái)分別求出未知的端點(diǎn)坐標(biāo), 接著利用這兩個(gè)方法又編寫(xiě)一個(gè)方法private void caculateCrossPoi nt(來(lái)對(duì)直線段和相應(yīng)的窗口邊界進(jìn)行求交處理。(6)最后是利用上面編寫(xiě)的各個(gè)方法來(lái)編寫(xiě)主代碼public void cutLine(),實(shí)現(xiàn)直線段的裁剪。( 7)核心主代碼如下所示:/裁剪算法public void cutLine() int temp = 0;while (true) cod in gPo in t();對(duì)直線端點(diǎn)進(jìn)行編碼if (OR(p1, p2) = 0) /判斷 p1|p2是否等于 0o

5、ut_x1 = x1;out_y1 = y1;out_x2 = x2;out_y2 = y2;break;else if (AND(p1, p2) = 1) /判斷 p1&p2 是否等于 1out_x1 = 0;out_y1 = 0;out_x2 = 0;out_y2 = 0;break;else if (AND(p1, p2) = 0) 判斷 p1&p2 是否等于 0if (isInWindow(p1) = 0) p1點(diǎn)是否在窗口里面,0表示在窗口里面 temp = x1;x1 = x2;x2 = temp;temp = y1;y1 = y2;y2 = temp;codi ngPoi nt(

6、);重新對(duì)端點(diǎn)進(jìn)行編碼caculateCrossPo int()/ 求交四、實(shí)現(xiàn)功能說(shuō)明(包括操作說(shuō)明)銘 歡迎使用直線段的截零如上圖所示,該軟件有四個(gè)按鈕和一個(gè)繪圖區(qū)。(1)用戶可以先點(diǎn)擊“畫(huà)矩形”按鈕,然后在繪圖區(qū)按住鼠標(biāo)并拖動(dòng),便能繪 制出一個(gè)用戶想要的矩形。(2)點(diǎn)擊“畫(huà)直線”按鈕,然后在繪圖區(qū)的任意兩個(gè)位置分別用鼠標(biāo)點(diǎn)擊一下(即確定直線的兩個(gè)端點(diǎn)),便可以繪制出一條用戶想要的直線。(3)點(diǎn)擊“裁剪”按鈕,便執(zhí)行裁剪算法,即進(jìn)行直線段的裁剪,并會(huì)把裁剪 的最終結(jié)果以圖形的形式反映在繪圖區(qū)上。(4)點(diǎn)擊“清屏”按鈕,可實(shí)現(xiàn)屏幕的清屏,方便用戶重新繪制矩形和直線段。F面是對(duì)某個(gè)例子的演示(

7、1)分別點(diǎn)擊按鈕“畫(huà)矩形”和“畫(huà)直線”,然后繪制出如圖1所示的圖形圖1(2)點(diǎn)擊“裁剪”按鈕,便可執(zhí)行出如圖 2所示的裁剪結(jié)果圖2四、實(shí)驗(yàn)心得做本實(shí)驗(yàn)的第一步當(dāng)然是語(yǔ)言的選擇,我是選擇了JAVA語(yǔ)言來(lái)完成本實(shí)驗(yàn)的編程實(shí)現(xiàn)。接著,在大概熟悉了 JAVA語(yǔ)言的編程方法后,便開(kāi)始著手于實(shí)驗(yàn)的代碼實(shí) 現(xiàn)。在把Cohen-Sutherland算法流程搞清楚后,便根據(jù)書(shū)上的步驟一步步編下來(lái)。根據(jù)書(shū)本的步驟編寫(xiě) Cohe n-Sutherla nd算法,感覺(jué)思路很清晰,就是把代碼 模塊化,盡量一個(gè)方法里面的代碼行數(shù)不要超過(guò)30行。這也方便以后的維護(hù)和修改。當(dāng)怎么來(lái)驗(yàn)證我這個(gè)算法的編寫(xiě)是否正確呢?簡(jiǎn)單的輸入幾

8、個(gè)參數(shù)值,再看輸出結(jié)果,顯然不夠直觀。所以,便參閱了一些JAVA編程的書(shū)籍,比如JAVA 語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì) 一清華大學(xué)出版社,JAVA參考大全之類(lèi)的書(shū)籍。 主要是看圖形繪制部分和響應(yīng)鼠標(biāo)事件的代碼實(shí)現(xiàn)。例題代碼看懂了,以為模仿一下就可以實(shí)現(xiàn)我的實(shí)驗(yàn)?zāi)康牧?。但是,事情卻未能一蹴而就。(1)鼠標(biāo)位置的定位問(wèn)題,這個(gè)問(wèn)題我花了兩個(gè)下午加一個(gè)晚上才解決掉。 我是在容器contentPane里面添加了一個(gè)容器jPanel_Graphics,并打算把 jPanel_Graphics當(dāng)作我的繪圖區(qū),問(wèn)題就這么出現(xiàn)了:每次我在位置A點(diǎn)擊鼠標(biāo), 可畫(huà)出的點(diǎn)卻是在位置B,不管怎么修改代碼,就是不能實(shí)現(xiàn)鼠標(biāo)的

9、準(zhǔn)確定位, 我的一個(gè)同學(xué)也是用 JAVA 編程的,但他是新建 JAVA APPLET 程序(我是新建 JAVA APPLICATION 程序),他不會(huì)出現(xiàn)我的這個(gè)見(jiàn)鬼的問(wèn)題。反正就是折騰了 好久,還上網(wǎng)查了很多相關(guān)的資料,但就是沒(méi)看到有用的信息。后來(lái),我只好試 著人為在代碼里面修改畫(huà)點(diǎn)的位置, 就是準(zhǔn)備畫(huà)的點(diǎn)的 X 坐標(biāo) = 從鼠標(biāo)點(diǎn)擊事 件得到的 e.getX() + 4, Y 坐標(biāo) = 從鼠標(biāo)點(diǎn)擊事件得到的 e.getY() + 31, 4和 31 是我慢滿調(diào)試出來(lái)的, 從視覺(jué)效果上看, 基本實(shí)現(xiàn)了鼠標(biāo)的準(zhǔn)確定位。 這個(gè)問(wèn)題 真的是讓我郁悶了好久, 剛開(kāi)始還以為實(shí)驗(yàn)做不下去了, 因?yàn)槿绻?/p>

10、連鼠標(biāo)的準(zhǔn) 確定位都實(shí)現(xiàn)不了, 接下去的畫(huà)矩形和把裁剪結(jié)果用圖形的方式顯示出來(lái), 根本 就無(wú)從談起?。?)鼠標(biāo)位置的定位問(wèn)題解決了, 接著是怎么來(lái)保存我畫(huà)的直線的端點(diǎn), 顯 然,用數(shù)組是不行, 因?yàn)槟銦o(wú)法預(yù)知究竟用戶會(huì)畫(huà)幾條直線。 最后找到了一個(gè)庫(kù) 中本來(lái)就支持的Point類(lèi)和Vector類(lèi)。用它來(lái)記錄端點(diǎn)坐標(biāo)。(3)至于拖動(dòng)鼠標(biāo)畫(huà)出矩形,是參考了 JAVA 完美經(jīng)典 江義華,林彩 榆,沒(méi)什么大問(wèn)題出現(xiàn)。(4)又一個(gè)嚴(yán)峻問(wèn)題出現(xiàn)了,那就是屏幕的清屏(刷新) 。我同學(xué)是利用畫(huà) 一個(gè)跟屏幕背景一樣顏色的矩形來(lái)實(shí)現(xiàn)清屏的, 我總覺(jué)得不是很好, 后來(lái),真的 是偶然,發(fā)現(xiàn)了 super.update(g

11、這個(gè)方法,簡(jiǎn)單的調(diào)用一下這個(gè)方法,便很好的 實(shí)現(xiàn)了清屏目的。( 6)在搞 定了 這些 大大小 小的 問(wèn)題 后, 我便調(diào) 用我 剛開(kāi) 始寫(xiě) 的那個(gè) Cohen-Sutherland算法,看看是否正確。運(yùn)行了一下,無(wú)法實(shí)現(xiàn)裁剪。由于JBuilder X這個(gè)環(huán)境我還不知道如何進(jìn)行單步調(diào)試,所以只好利用這個(gè)方法輸出一些中間結(jié)果來(lái)判斷是哪里出錯(cuò)。 也是調(diào)試了好久,最后才找到病原, 其實(shí),這個(gè)病原并不大, 就是課本提供的對(duì)端點(diǎn)的編碼規(guī)則那里, 是把原點(diǎn)定在 左下角, 但是, 正如我們大家都知道, 卻容易忽視的顯示屏幕的原點(diǎn)是位于 左上角的!就是這個(gè)問(wèn)題,影響了我結(jié)果的正確輸出。(7)修改了相關(guān)的代碼后, 裁剪結(jié)果正確顯示輸出了, 這確實(shí)令人為之振奮。 但 當(dāng) 我 點(diǎn) 擊 清 屏 按 鈕 , 重 新 畫(huà) 直線 時(shí) , 編 譯 環(huán) 境 發(fā) 出 警 告 提 示我 NullPointerException,真是一波三折,真是快崩潰了,又出什么問(wèn)題了?經(jīng)過(guò)仔 細(xì)的檢查后,才發(fā)現(xiàn)是Vector類(lèi)出問(wèn)題了,執(zhí)行向Vcotr增加元素和刪除元素操 作時(shí),沒(méi)把握好指針位置

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論