




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、四、線段裁剪%Sutherland_Test.m文件,主文件函數(shù)clear all;clc;MainMenu();%check_callback.m文件,查看圖形函數(shù)function check_callback()%查看原始線段圖形回調(diào)函數(shù)%lines矩陣共四列,每一列的含義如下:%端點(diǎn)A x坐標(biāo) 端點(diǎn)A y坐標(biāo) 端點(diǎn)B x坐標(biāo) 端點(diǎn)B y坐標(biāo)%lines=getappdata(0,lines);if isempty(lines)errordlg(當(dāng)前尚未生成線段,無(wú)法顯示!);return;endfigure();hold on;for i=1:length(lines(:,1)plot(
2、lines(i,1,3),lines(i,2,4);endhold off;end %Cohen_Sutherland.m文件,編碼裁剪算法function Lines=Cohen_Sutherland(line,Rectangle)%編碼裁剪算法%line為線段端點(diǎn)矩陣,共四列,其數(shù)據(jù)含義如下:%端點(diǎn)A x坐標(biāo) 端點(diǎn)A y坐標(biāo) 端點(diǎn)B x坐標(biāo) 端點(diǎn)B y坐標(biāo)%Rectangle為窗口邊界值,共四個(gè)元素,其含義分別為Xwl,Xwr,Ywb,Ywt%首先檢測(cè)參數(shù)是否合法row column=size(line);if column4|length(Rectangle)4Lines=;fprint
3、f(參數(shù)不合法不合法);return ;end %程序中主要變量說(shuō)明%code為線段端點(diǎn)的編碼矩陣,兩行四列,第一行為點(diǎn)%四列的含義為:D0,D1,D2,D3%依次處理line的各個(gè)線段k=0;Lines=;for i=1:length(line(:,1)P1的編碼,第二行為點(diǎn)P2的編碼%取出第i條線段P1=line(i,1,2);P2=line(i,3,4);%計(jì)算斜率PP=P1-P2;if PP(1)=0k=inf;elsek=PP(2)/PP(1);endfinished=false;while(finished)%對(duì)點(diǎn)P1和P2進(jìn)行編碼code=P1(1)Rectangle(2),P1
4、(2)Rectangle(4);P2(1)Rectangle(2),P2(2)Rectangle(4); ;% P1,P2,k,code%進(jìn)行簡(jiǎn)取或簡(jiǎn)棄的判斷test=code(1,:)|code(2,:);%判斷是否簡(jiǎn)取if isempty(find(test0,1) Lines=Lines;P1,P2; finished=true;end%假設(shè)當(dāng)前線段處理完成,那么退出if finishedbreak;end%判斷是否簡(jiǎn)棄test=code(1,:)&code(2,:);if isempty(find(test0, 1) finished=true;endif finishedbr
5、eak;end%確保P1在窗口之外if isempty(find(code(1,:)0,1)%交換P1,P2的坐標(biāo)值和編碼PT=P1;P1=P2;P2=PT;PT=code(1,:);code(1,:)=code(2,:);code(2,:)=PT;end%從低位開(kāi)始找編碼值為1的地方D=find(code(1,:)0,1);if D0,1);else%假設(shè)線段是斜線,那么計(jì)算y值,x值變?yōu)榇翱诘淖筮吔缁蛴疫吔鏟1=Rectangle(D),P1(2)+k*(Rectangle(D)-P1(1);endelse%此時(shí)P1位于窗口的上方或下方if k=inf%假設(shè)線段是豎直線,那么x不變,y變?yōu)?/p>
6、窗口的上邊界或下邊界%且此時(shí)k不會(huì)等于0,否那么線段將處于簡(jiǎn)棄狀態(tài)。P1(2)=Rectangle(D);else%假設(shè)線段是斜線,那么計(jì)算x值,y值變?yōu)榇翱诘纳线吔缁蛳逻吔?。P1=P1(1)+(Rectangle(D)-P1(2)/k,Rectangle(D);endend%對(duì)P1和P2重新編碼,再次計(jì)算。% P1,P2,k,code% pause(10);% scanf(D,%d);% inputdlg();endend%對(duì)最終點(diǎn)進(jìn)行取整運(yùn)算%Lines=round(Lines);end%DrawOriginalGraph.m文件,繪制原始線段圖形函數(shù)function DrawOrigin
7、alGraph()%繪制原始線段圖形函數(shù)%lines矩陣共四列,每一列的含義如下:%端點(diǎn)A x坐標(biāo) 端點(diǎn)A y坐標(biāo) 端點(diǎn)B x坐標(biāo) 端點(diǎn)B y坐標(biāo)%lines=getappdata(0,lines);if isempty(lines)errordlg(當(dāng)前尚未生成線段,無(wú)法顯示!);return;endfigure(name,原始線段圖形);hold on;for i=1:length(lines(:,1)plot(lines(i,1,3),lines(i,2,4);endhold off;end%DrawSutherlandGraph.m文件,繪制編碼裁剪算法裁剪后線段函數(shù)function
8、DrawSutherlandGraph(OriginalLines,Rectangle,SutherlandedLines)%繪制裁剪前后線段比照?qǐng)D%OriginalLines是初始線段矩陣,Rectangle是裁剪窗口參數(shù),SutherlandedLines是裁剪后的線段矩陣%OriginalLines與SutherlandedLines分別有四列,每一列的參數(shù)定義相同,如下所示:%端點(diǎn)A x坐標(biāo) 端點(diǎn)A y坐標(biāo) 端點(diǎn)B x坐標(biāo) 端點(diǎn)B y坐標(biāo)%Rectangle共四個(gè)元素,每個(gè)元素的定義分別為Xwl,Xwr,Ywb,Ywt。figure(name,線段原始圖形與裁剪后的比照?qǐng)D);%在第一個(gè)
9、小圖里繪制原始線段圖形以及裁剪窗口subplot(2,1,1);hold on;%繪制原始線段for i=1:length(OriginalLines(:,1)plot(OriginalLines(i,1,3),OriginalLines(i,2,4);end%繪制裁剪窗口R=Rectangle;RLines=R(1),R(3),R(2),R(3);R(2),R(3),R(2),R(4);R(2) ,R (4),R(1),R(4);R(1),R(4),R(1),R(3);for i=1:length(RLines(:,1)plot(RLines(i,1,3),RLines(i,2,4),-r)
10、;endhold off;%在第二個(gè)小圖里繪制裁剪后的圖形及裁剪窗口 subplot(2,1,2);hold on;for i=1:length(SutherlandedLines(:,1)plot(SutherlandedLines(i,1,3),SutherlandedLines(i,2,4);end%繪制裁剪窗口for i=1:length(RLines(:,1)plot(RLines(i,1,3),RLines(i,2,4),-r);endhold off;end%generate_callback.m文件,function generate_callback()%生成線段回調(diào)函數(shù)%p
11、rompt=輸入線段條數(shù),線段端點(diǎn)x坐標(biāo)最大值,線段端點(diǎn)y坐標(biāo)最大值;%設(shè)置提示字符 串title=生成線段;%設(shè)置標(biāo)題numline=1;%指定輸入數(shù)據(jù)行數(shù)defdata=20,100,100;%指定數(shù)據(jù)的默認(rèn)值Resize=on;%設(shè)置對(duì)話框大小為可調(diào)節(jié)的answer=inputdlg(prompt,title,numline,defdata,Resize);%假設(shè)用戶(hù)點(diǎn)擊“取消鍵,那么直接退出if isempty(answer)return;end%將輸入對(duì)話框的輸入值轉(zhuǎn)化為浮點(diǎn)數(shù)data=str2num(char(answer);lines=GenerateLines(round(da
12、ta(1),data(2),data(3);setappdata(0,lines,lines);answer=questdlg(是否查看已生成的線段,提問(wèn)對(duì)話框,是,否,是);%answer,strcmp(answer,是)if strcmp(answer,是)%繪制原始線段圖形DrawOriginalGraph();endend%GenereateLines.m文件,隨機(jī)生成線段函數(shù)function Lines=GenerateLines(count,MaxX,MaxY)%隨機(jī)生成count條線段,以矩陣Lines返回。%MaxX是線段端點(diǎn)x坐標(biāo)的最大值,MaxY是線段端點(diǎn)y坐標(biāo)最大值%Li
13、nes矩陣共四列,每一列的含義如下:%端點(diǎn)A x坐標(biāo) 端點(diǎn)A y坐標(biāo) 端點(diǎn)B x坐標(biāo) 端點(diǎn)B y坐標(biāo)%line=rand(count,4);line(:,1,3)=rand(count,2)*MaxX;line(:,2,4)=rand(count,2)*MaxY;Lines=line; end%MainMenu.m文件,這界面函數(shù)function MainMenu()%程序主菜單界面%leftbase=0;bottombase=-50;%初始化線段矩陣linessetappdata(0,lines,);figure();uicontrol(Style,pushbutton,string,生 成
14、線段,position,200+leftbase 350+bottombase 100 50,.callback,generate_callback);uicontrol(Style,pushbutton,string,裁剪,position,200+leftbase 280+bottombase 100 50,.callback,sutherland_callback);uicontrol(Style,pushbutton,string,查看原始線段圖形,position,200+leftbase 210+bottombase 10050,.callback,check_callback);
15、end%sutherland_callback.m文件function sutherland_callback()%裁剪算法回調(diào)函數(shù)%lines=getappdata(0,lines);if isempty(lines)errordlg(當(dāng)前尚未生成線段!n請(qǐng)先生成線段,錯(cuò)誤提示);return;endwhile trueprompt=窗口參數(shù)Xwl,窗口參數(shù)Xwr,窗口參數(shù)Ywb,窗口參數(shù)Ywt;%設(shè)置提示字符 串title=窗口參數(shù);%設(shè)置標(biāo)題numline=1;%指定輸入數(shù)據(jù)行數(shù)defdata=0,1000,0,1000;%指定數(shù)據(jù)的默認(rèn)值Resize=on;%設(shè)置對(duì)話框大小為可調(diào)節(jié)的answer=inputdlg(prompt,title,numline,defdata,Resize);%假設(shè)用戶(hù)點(diǎn)擊了 “取消鍵,那么直接退出。if isempty(answer)return;enddata=str2num(char(answer);if data(1)data
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 青海柴達(dá)木職業(yè)技術(shù)學(xué)院《農(nóng)田雜草及防除》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西財(cái)經(jīng)大學(xué)華商學(xué)院《金融數(shù)據(jù)采集》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼陽(yáng)職業(yè)技術(shù)學(xué)院《電視欄目專(zhuān)題與制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州大學(xué)《產(chǎn)品設(shè)計(jì)報(bào)告書(shū)制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 做賬實(shí)操-保險(xiǎn)公司理賠支出的賬務(wù)處理分錄
- 2025屆上海市寶山區(qū)高三一模考試歷史試卷
- 江西外語(yǔ)外貿(mào)職業(yè)學(xué)院《文獻(xiàn)查閱與交流》2023-2024學(xué)年第二學(xué)期期末試卷
- 柳州職業(yè)技術(shù)學(xué)院《行政倫理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 長(zhǎng)春職業(yè)技術(shù)學(xué)院《商務(wù)談判》2023-2024學(xué)年第二學(xué)期期末試卷
- 首都師范大學(xué)《工程制圖與全專(zhuān)業(yè)三維識(shí)圖課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 《感冒中醫(yī)治療》課件
- 研發(fā)費(fèi)用管理制度內(nèi)容
- 壓力容器設(shè)計(jì)委托書(shū)
- 《眉毛的基本技法》課件
- 人教版PEP小學(xué)五年級(jí)英語(yǔ)下冊(cè)全冊(cè)教案(含計(jì)劃)
- 2025年幼兒園膳食工作計(jì)劃
- 藥劑學(xué)第9版課件:第一章-緒論
- 2023年中考英語(yǔ)話題復(fù)習(xí)課件 健康與飲食
- 2023年機(jī)動(dòng)車(chē)檢測(cè)站質(zhì)量手冊(cè)和程序文件(根據(jù)補(bǔ)充要求編制)
- 電化學(xué)儲(chǔ)能系統(tǒng)測(cè)試操作方法
- 人教版英語(yǔ)八年級(jí)上冊(cè)《Unit 8 How do you make a banana milk shake》大單元整體教學(xué)設(shè)計(jì)2022課標(biāo)
評(píng)論
0/150
提交評(píng)論