資源描述:
《線段裁剪代碼MATLAB.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、四、線段裁剪%Sutherland_Test.m文件,主文件函數(shù)clearall;clc;MainMenu();%check_callback.m文件,查看圖形函數(shù)functioncheck_callback()%查看原始線段圖形回調(diào)函數(shù)%lines矩陣共四列,每一列的含義如下:%端點(diǎn)Ax坐標(biāo)端點(diǎn)Ay坐標(biāo)端點(diǎn)Bx坐標(biāo)端點(diǎn)By坐標(biāo)%lines=getappdata(0,'lines');ifisempty(lines)errordlg('當(dāng)前尚未生成線段,無(wú)法顯示!');return;endfigure();holdon;fori=1:length(lines(:,
2、1))plot(lines(i,[1,3]),lines(i,[2,4]));endholdoff;end%Cohen_Sutherland.m文件,編碼裁剪算法functionLines=Cohen_Sutherland(line,Rectangle)%編碼裁剪算法%line為線段端點(diǎn)矩陣,共四列,其數(shù)據(jù)含義如下:%端點(diǎn)Ax坐標(biāo)端點(diǎn)Ay坐標(biāo)端點(diǎn)Bx坐標(biāo)端點(diǎn)By坐標(biāo)%Rectangle為窗口邊界值,共四個(gè)元素,其含義分別為Xwl,Xwr,Ywb,Ywt。%%首先檢測(cè)參數(shù)是否合法[rowcolumn]=size(line);ifcolumn<4
3、
4、length(Re
5、ctangle)<4Lines=[];fprintf('參數(shù)不合法不合法');return;end%%程序中主要變量說(shuō)明%code為線段端點(diǎn)的編碼矩陣,兩行四列,第一行為點(diǎn)P1的編碼,第二行為點(diǎn)P2的編碼%四列的含義為:D0,D1,D2,D3%%依次處理line的各個(gè)線段k=0;Lines=[];fori=1:length(line(:,1))%取出第i條線段P1=line(i,[1,2]);P2=line(i,[3,4]);%計(jì)算斜率PP=P1-P2;ifPP(1)==0k=inf;elsek=PP(2)/PP(1);endfinished=false;whil
6、e(~finished)%對(duì)點(diǎn)P1和P2進(jìn)行編碼code=[P1(1)Rectangle(2),P1(2)Rectangle(4);P2(1)Rectangle(2),P2(2)Rectangle(4);];%P1,P2,k,code%進(jìn)行簡(jiǎn)取或簡(jiǎn)棄的判斷test=code(1,:)
7、code(2,:);%判斷是否簡(jiǎn)取ifisempty(find(test>0,1))Lines=[Lines;[P1,P2]
8、];finished=true;end%若當(dāng)前線段處理完成,則退出iffinishedbreak;end%判斷是否簡(jiǎn)棄test=code(1,:)&code(2,:);if~isempty(find(test>0,1))finished=true;endiffinishedbreak;end%確保P1在窗口之外ifisempty(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%從低位開始找編碼值為1的地方D=
9、find(code(1,:)>0,1);ifD<=2%此時(shí)P1位于窗口的左邊或右邊ifk==0%若是水平線,則y不變,x變?yōu)榇翱诘淖筮吔缁蛴疫吔?且此時(shí)k不會(huì)等于inf,否則線段處于簡(jiǎn)棄狀態(tài)。P1(1)=Rectangle(D);%P1(2)=Rectangle(find(code(1,[3,4])>0,1));else%若線段是斜線,則計(jì)算y值,x值變?yōu)榇翱诘淖筮吔缁蛴疫吔鏟1=[Rectangle(D),P1(2)+k*(Rectangle(D)-P1(1))];endelse%此時(shí)P1位于窗口的上方或下方ifk==inf%若線段是豎直線,則x不變,y變?yōu)榇翱?/p>
10、的上邊界或下邊界%且此時(shí)k不會(huì)等于0,否則線段將處于簡(jiǎn)棄狀態(tài)。P1(2)=Rectangle(D);else%若線段是斜線,則計(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ù)functi
11、onDra