线段裁剪代码-MATLAB

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四、线段裁剪

%Sutherland_Test.m文件,主文件函数

clear all;

clc;

MainMenu();

%check_callback.m文件,查看图形函数

function check_callback()

%查看原始线段图形回调函数

%lines矩阵共四列,每一列的含义如下:

%端点A x坐标端点A y坐标端点B x坐标端点B y坐标%

lines=getappdata(0,'lines');

if isempty(lines)

errordlg('当前尚未生成线段,无法显示!');

return;

end

figure();

hold on;

for i=1:length(lines(:,1))

plot(lines(i,[1,3]),lines(i,[2,4]));

end

hold off;

end

%Cohen_Sutherland.m文件,编码裁剪算法

function Lines=Cohen_Sutherland(line,Rectangle)

%编码裁剪算法

%line为线段端点矩阵,共四列,其数据含义如下:

% 端点A x坐标端点A y坐标端点B x坐标端点B y坐标

%Rectangle为窗口边界值,共四个元素,其含义分别为Xwl,Xwr,Ywb,Ywt。

%

%首先检测参数是否合法

[row column]=size(line);

if column<4||length(Rectangle)<4

Lines=[];

fprintf('参数不合法不合法');

return ;

end

%

%程序中主要变量说明

%code为线段端点的编码矩阵,两行四列,第一行为点P1的编码,第二行为点P2的编码% 四列的含义为:D0,D1,D2,D3

%

%依次处理line的各个线段

k=0;

Lines=[];

for i=1:length(line(:,1))

%取出第i条线段

P1=line(i,[1,2]);

P2=line(i,[3,4]);

%计算斜率

PP=P1-P2;

if PP(1)==0

k=inf;

else

k=PP(2)/PP(1);

end

finished=false;

while(~finished)

%对点P1和P2进行编码

code=[

P1(1)Rectangle(2),P1(2)Rectangle(4);

P2(1)Rectangle(2),P2(2)Rectangle(4);

];

% P1,P2,k,code

%进行简取或简弃的判断

test=code(1,:)|code(2,:);

%判断是否简取

if isempty(find(test>0,1))

Lines=[Lines;[P1,P2]];

finished=true;

end

%若当前线段处理完成,则退出if finished

break;

end

%判断是否简弃

test=code(1,:)&code(2,:);

if ~isempty(find(test>0, 1))

finished=true;

end

if finished

break;

end

%确保P1在窗口之外

if isempty(find(code(1,:)>0,1)) %交换P1,P2的坐标值和编码

PT=P1;P1=P2;P2=PT;

PT=code(1,:);code(1,:)=code(2,:);code(2,:)=PT;

end

%从低位开始找编码值为1的地方

D=find(code(1,:)>0,1);

if D<=2

%此时P1位于窗口的左边或右边

if k==0

%若是水平线,则y不变,x变为窗口的左边界或右边界

%且此时k不会等于inf,否则线段处于简弃状态。

P1(1)=Rectangle(D);

%P1(2)=Rectangle(find(code(1,[3,4])>0,1));

else

%若线段是斜线,则计算y值,x值变为窗口的左边界或右边界

P1=[Rectangle(D),P1(2)+k*(Rectangle(D)-P1(1))];

end

else

%此时P1位于窗口的上方或下方

if k==inf

%若线段是竖直线,则x不变,y变为窗口的上边界或下边界

%且此时k不会等于0,否则线段将处于简弃状态。

P1(2)=Rectangle(D);

else

%若线段是斜线,则计算x值,y值变为窗口的上边界或下边界。

P1=[P1(1)+(Rectangle(D)-P1(2))/k,Rectangle(D)];

end

end

%对P1和P2重新编码,再次计算。

% P1,P2,k,code

% pause(10);

% scanf(D,'%d');

% inputdlg('');

end

end

%对最终点进行取整运算

%Lines=round(Lines);

end

%DrawOriginalGraph.m文件,绘制原始线段图形函数

function DrawOriginalGraph()

%绘制原始线段图形函数

%lines矩阵共四列,每一列的含义如下:

%端点A x坐标端点A y坐标端点B x坐标端点B y坐标

%

lines=getappdata(0,'lines');

相关文档
最新文档