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

下載本文檔

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

文檔簡介

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

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

3、tPoint(int x1, int y1, int x2, int y2) 來設(shè)置直線 段的兩端點坐標。( 4)聲明兩個方法 private int OR(int op1, int op2) 和 private int AND(int op1, int op2) 來分別 實現(xiàn)編碼后的 端點的 相或和相與。 并編寫 一個方法 isInWindow(int op) 來判斷點 op 是否在窗口中。( 5)編寫兩個方法 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) 來分別求出未知的端點坐標, 接著利用這兩個方法又編寫一個方法private void caculateCrossPoi nt(來對直線段和相應(yīng)的窗口邊界進行求交處理。(6)最后是利用上面編寫的各個方法來編寫主代碼public void cutLine(),實現(xiàn)直線段的裁剪。( 7)核心主代碼如下所示:/裁剪算法public void cutLine() int temp = 0;while (true) cod in gPo in t();對直線端點進行編碼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點是否在窗口里面,0表示在窗口里面 temp = x1;x1 = x2;x2 = temp;temp = y1;y1 = y2;y2 = temp;codi ngPoi nt(

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論