⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cohensoutherlandlineclipping.m

📁 Cohen-Southerland线段裁剪算法的Matlab程序
💻 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); 

% 设置绘图环境
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线段裁剪算法实现
code0 = PointEncoding(x0,y0,XL,XR,YB,YT); % 计算端点P0(x0,y0)的编码
code1 = PointEncoding(x1,y1,XL,XR,YB,YT);  % 计算端点P1(x1,y1)的编码
LEFT = 1; 
RIGHT = 2; 
BOTTOM = 4; 
TOP = 8;
flag = 1;
while code0 ~= 0 | code1 ~= 0  % 线段P0P1至少有一个端点在窗口外
    
    % 计算线段与窗口边界的交点
    if bitand(code0,code1) ~= 0 % 线段完全在窗口外(即完全不可见)
       flag = 0; break;
    end
    if code0 ~= 0 code = code0; % 确定线段在窗口外的点
    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
  
   % 修改线段的端点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

% 恢复绘图环境
hold off; 

%---------------------------------------------
function code = PointEncoding(x,y,XL,XR,YB,YT)
% 计算窗口平面点的编码

% initialize
LEFT = 1; 
RIGHT = 2; 
BOTTOM = 4; 
TOP = 8;
code = 0;

% 计算点(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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -