第六节裁剪 裁剪就是去掉窗口外的不可见部分, 保留窗口内的可见部分的过程。 裁剪区域:矩形、任意图形 裁剪对象:点、线段、多边形、 二维或三维形体 假设窗口的两个对角顶点分别 是(%)、(xr),则同时满足下列不等式的 点(x,y)是要保留的点,否则就要被舍弃: 7≤x≤xr,yb≤syt
第六节 裁剪 裁剪就是去掉窗口外的不可见部分, 保留窗口内的可见部分的过程。 裁剪区域:矩形、任意图形 裁剪对象:点、线段、多边形、 二维或三维形体 假设窗口的两个对角顶点分别 是 、 ,则同时满足下列不等式的 点 是要保留的点,否则就要被舍弃: ( , ) b y l x ( , ) t y r x (x, y) t y y b y r x x l x ,
直线段裁剪算法 Cohen-Sutherland:算法 该算法的基本思想是:首先判断直线 段是否全部在窗口内,是,则保留;不 是,则再判断是否完全在窗口之外,如 是,则舍弃。如果这两种情况都不属于 ,则将此直线段分割,对分割后的子线 段再进行如前判断。直至所有直线段和 由直线段分割出来的子线段都已经确定 了是保留还是舍弃为止
直线段裁剪算法 Cohen-Sutherland算法 该算法的基本思想是:首先判断直线 段是否全部在窗口内,是,则保留;不 是,则再判断是否完全在窗口之外,如 是,则舍弃。如果这两种情况都不属于 ,则将此直线段分割,对分割后的子线 段再进行如前判断。直至所有直线段和 由直线段分割出来的子线段都已经确定 了是保留还是舍弃为止
1001 1000 1010 yt 0001 0000 0010 yo 0101 0100 0110 x Xr 图3.25 区域编码 编码:如果该区域在窗口的上方,则代码的第一位为1 如果该区域在窗口的下方,则代码的第二位为1;如果 该区域在窗口的右侧,则代码的第三位为1;如果该区 域在窗口的左侧,则代码的第四位为1
编码:如果该区域在窗口的上方,则代码的第一位为1; 如果该区域在窗口的下方,则代码的第二位为1;如果 该区域在窗口的右侧,则代码的第三位为1;如果该区 域在窗口的左侧,则代码的第四位为1
D H 算法步骤如下: 4 第一步:编码 J 第二步:判别 B 第三步:求交 第四步:对剩下的 线段重复以上各步 XL 图3.26 Cohen-sutherland裁剪箅
算法步骤如下: 第一步:编码 第二步:判别 第三步:求交 第四步:对剩下的 线段重复以上各步
算法的程序实现如下 函数Cohen Suther I and,用来实现算法 函数makecode)用来编码,利用数值位运算 double xI,xr,yt,yb;(事先给出窗口的 位置,四个数值是已知的) void Cohen Sutherland(double x0,y0,x2,y2) { int c,cl,c2; double x,y; makecode(x0,y0,c1);makecode(x2,y2,c2); while(c1!=0‖c2!=0) if (c1&c2!=0)return;
算法的程序实现如下 函数Cohen_Sutherland用来实现算法 函数makecode用来编码,利用数值位运算 double xl, xr, yt, yb; (事先给出窗口的 位置,四个数值是已知的) void Cohen_Sutherland(double x0, y0, x2, y2) { int c, c1, c2; double x, y; makecode(x0, y0,c1); makecode(x2, y2, c2); while (c1!=0 || c2!=0) { if (c1&c2!=0) return;