?? cohensoutherlandlineclipping.m
字號:
function CohenSoutherlandLineClipping
% Cohen-Southerland線段裁剪算法的Matlab程序
%
% Copyright (c) 2005. Zhou Dengwen. All rights reserved.
% Department of Computer Science & Technology
% Northern China Electric Power University(Beijing)(NCEPU)
%
x0 = 3; y0 = 1; x1 = 13; y1 = 8; % 待裁剪的線段
%x0 = 10.5; y0 = 0.5; x1 = 12; y1 = 2.5;
%x0 = 6; y0 = 4; x1 = 10; y1 = 6;
x = [4 11 11 4 4]; y = [2 2 7 7 2]; % 裁剪窗口
XL = min(x); XR = max(x); YB = min(y); YT = max(y);
% 設(shè)置繪圖環(huán)境
hold on; axis equal;
grid on;
% 畫出要裁剪的線段和裁剪窗口
plot([x0 x1],[y0 y1],'r-','LineWidth',2);
text(x0,y0,'\leftarrow P0','FontSize',16,'Color',[0,0,1]);
text(x1,y1,'\leftarrow P1','FontSize',16,'Color',[0,0,1]);
plot(x,y,'g-','LineWidth',1.5);
title('Cohen-Southerland線段裁剪算法演示');
% Cohen-Southerland線段裁剪算法實(shí)現(xiàn)
code0 = PointEncoding(x0,y0,XL,XR,YB,YT); % 計算端點(diǎn)P0(x0,y0)的編碼
code1 = PointEncoding(x1,y1,XL,XR,YB,YT); % 計算端點(diǎn)P1(x1,y1)的編碼
LEFT = 1;
RIGHT = 2;
BOTTOM = 4;
TOP = 8;
flag = 1;
while code0 ~= 0 | code1 ~= 0 % 線段P0P1至少有一個端點(diǎn)在窗口外
% 計算線段與窗口邊界的交點(diǎn)
if bitand(code0,code1) ~= 0 % 線段完全在窗口外(即完全不可見)
flag = 0; break;
end
if code0 ~= 0 code = code0; % 確定線段在窗口外的點(diǎn)
else code = code1;
end
if bitand(LEFT,code) ~= 0 % 線段與窗口左邊界相交
x = XL;
y = y0+(y1-y0)*(XL-x0)/(x1-x0);
elseif bitand(RIGHT,code) ~= 0 % 線段與窗口右邊界相交
x = XR;
y = y0+(y1-y0)*(XR-x0)/(x1-x0);
elseif bitand(BOTTOM,code) ~= 0 % 線段與窗口下邊界相交
y = YB;
x = x0+(x1-x0)*(YB-y0)/(y1-y0);
elseif bitand(TOP,code) ~= 0 % 線段與窗口上邊界相交
y = YT;
x = x0+(x1-x0)*(YT-y0)/(y1-y0);
end
% 修改線段的端點(diǎn)P0(x0,y0)或P1(x1,y1)
if code == code0
x0 = x; y0 = y; code0 = PointEncoding(x,y,XL,XR,YB,YT);
else
x1 = x; y1 = y; code1 = PointEncoding(x,y,XL,XR,YB,YT);
end
end
% 繪制裁剪后的線段
if flag ~= 0 % 線段不完全在窗口外(即線段部分或全部可見)
plot([x0 x1],[y0 y1],'k-','LineWidth',3);
end
% 恢復(fù)繪圖環(huán)境
hold off;
%---------------------------------------------
function code = PointEncoding(x,y,XL,XR,YB,YT)
% 計算窗口平面點(diǎn)的編碼
% initialize
LEFT = 1;
RIGHT = 2;
BOTTOM = 4;
TOP = 8;
code = 0;
% 計算點(diǎn)(x,y)的編碼
if x < XL code = bitor(code,LEFT); end
if x > XR code = bitor(code,RIGHT); end
if y < YB code = bitor(code,BOTTOM); end
if y > YT code = bitor(code,TOP); end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -