对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右;
‐如果两端点的编码均为0000,表示直线在窗口内。
‐如果两端点的编码相与不为0000,表示直线在窗口外。
‐如果两端点的编码不全为0000,但相与为0000,则该直线部分可见,需计算直线与窗口的交点,确定哪一部分可见。
(2)Sutherland-Hodgema算法(多边形裁减算法原理)
通过对单一边或面的裁剪来实现多边形的裁剪
分割处理策略:
将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪。
一次用窗口的一条边裁剪多边形。
流水线过程(左上右下):
前边的结果是后边的输入。
亦称逐边裁剪算法。
算法的每一次输出(包括中间结果)都是一个多边形的顶点表,且所有顶点均位于相应窗口裁剪边或面的可见一侧。
由于多边形的每一条边需要与裁剪边或面分别进行比较,因此只需要讨论单条边和单个裁剪边或面之间可能的
位置关系。
假设S,P为多边形的两个相邻顶点,且S为该边的起点,P为该边的终点,则变SP与裁剪边或面之间只有4种可能的关系
把平面分成两个部分:
一部分包含窗口,成为可见一侧;另一部分称为不可见一侧。
依序考虑多边形各边的两端点S,P。
它们与裁剪线的位置关系只有4中情况。
可见一侧S可见一侧
P
SP
(1)S,P均在可见一侧,计为P点
(2)S,P均不在可见一侧
P可见一侧可见一侧
P
SS
(3)S可见,P不可见(4)S不可见,P可见
由上可见,每一次将多边形的边与裁剪边或面比较后,输出一个或两个顶点,也可能无输出点。
如果SP边完全可见,则输出P点,不必输出起点S,因为顶点是按顺序处理的,S是作为前一边的终点输出的。
如果SP边完全不可见,则无输出。
如果SP边部分可见,则SP边可能进入或离开裁剪边或面的可见一侧。
如果SP边离开裁剪边或面的可见一侧,则输出SP与裁剪边或面交点。
如果SP边进入裁剪边或面的可见一侧,则输出两点,一个为SP与裁剪边或面的交点,一个是P点。
对于多边形的第一个顶点,只需判断其可见性。
如果可见,则输出且作为起点S;否则无输出,但还是要作为S保存,以便后续点处理。
对于最后一条边PnP1,其处理方法是:
标志第一顶点为F,这样最后一条边则为PnF,可与其他边作相同的处理。
实现方法:
⏹设置二个表:
◆输入顶点表:
用于存放被裁剪多边形的顶点p1-pm。
◆输出顶点表:
用于存放裁剪过程中及结果的顶点q1-qn。
⏹输入顶点表中各顶点要求按一定顺序排列,一般可采用顺时针或逆时针方向。
⏹相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪
实验环境
VisualstudioVC++6.0
实验步骤
1.根据Cohen-Sutherland直线剪裁算法思想,编写相应的程序,下面给出核心算法程序
(1)如下为编码函数:
(2)裁剪算法:
(3)运行后的界面如下:
2.Sutherland-Hodgema算法剪裁算法思想,编写相应的程序,下面给出主要代码:
(1)算法描述:
1.while对于每一个窗口边或面do
begin
2.ifP1在窗口边的可见一侧then输出P1
3.fori=1到ndo
begin
4.ifPi在窗口边的可见一侧then
5.ifPi+1在窗口边的可见一侧then输出Pi+1
6.else计算交点并输出交点
7.elseifPi+1在窗口边的可见一侧,then
计算交点并输出交点,同时输出Pi+1
end
end
8.endofalgorithm
(2)代码实现
实验内容
本程序实现了标准举行窗口对任意直线和任意多边形的裁减算法,具体查看试验结果。
实验结果
1.对直线裁剪运行的结果如下:
(1)点击“画直线”,在绘图区用鼠标绘制举行裁切窗口
(2)点击“画矩形”,在绘图去用鼠标绘制要被裁切的直线。
如图:
(3)点击“裁剪”,实行相应算法完成裁减,如下图:
2.对多边形裁剪运行的结果如下:
(1)运行的界面如下:
(2)用鼠标拖动画一个多边形,如下
其中红色部分表示裁剪后的结果
实验总结
1、通过本次试验,我对Cohen-Sutherland直线剪裁算法和Sutherland-Hodgman多边形裁剪算法有了更深刻的了解。
2、进行图形裁剪时,首先在课堂上了解了有关裁剪算法的过程,然后在进行代码的实现。
3、在做实验的时候也遇到了些问题,由于对算法的细节有些问题,使得代码编写中出现了错误。
经过了讨论研究,使得问题得以解决,从这个过程中学习到了很多东西。
这次实验让我受益匪浅。
指导教师意见
签名:
年月日