线段裁剪代码-MATLAB
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)
P2(1)
];
% 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');