Cohen-Sutherland算法裁剪线段

如何裁剪一条线

(《计算机图形学——openGL版(第三版)》)

Cohen-Sutherland裁剪器计算端点为p1和p2的线段的哪一部分在世界窗口中,并返回那个部分的端点。
考虑开发一个函数:

int clipSegment(Point2& p1, Point2 &p2, RealRect window);

它接受两个二维的点,以及一个对齐的矩形,将以p1和p2为端点的线段裁剪到窗口边界处。如果线段的某一部分在窗口内,则将新的断点存放在p1和p2中,并且函数返回1,说明线段的某些部分是可见的。如果这条线完全被裁剪掉了,函数返回0,说明没有任何部分可见。
裁剪器可能遇到的四种情况

裁剪器可能遇到的四种情况
  1. 如CD, 两端点均在窗口内,不裁剪,返回1
  2. 如BC, 一个端点在窗口外,裁剪一个点,返回1
  3. 如AB,两个端点均在窗口外,且在窗口内没有线段,返回0
  4. 如AE,两端点均在窗口外,且在窗口内有线段,裁剪两个点,返回1

对于一个窗口,线段的摆放可能有多种形式,一个通常的图画可能包含上千条线段,每条线段都必须依照窗口裁剪,所以效率很重要,Cohen-Sutherland算法针对这个问题提供了一个快速的分治算法。

Cohen-Sutherland算法

Cohen-Sutherland算法给线段的每个端点计算一个“窗口内部/外部编码”,将窗口看作四个半平面的交。
窗口内部/外部编码
编码由四个二进制位组成,如果点P在window的某条边界之外(和直线比较),则编码对应的一位取T。显然,若点P的编码为“FFFF”,则P位于window中。

平凡接受和平凡拒绝

若线段AB两端点都在窗口内,则线段也在窗口内,称平凡接受。若线段AB两端点都在窗口的一条边外,则线段也在窗口外,称平凡拒绝。其编码的监测方法为:

  • 平凡接受:两个编码都是FFFF
  • 平凡拒绝:两个编码在某一位上都是T
没有平凡接受或平凡拒绝时的截断

Cohen-Sutherland算法采用分治策略,若线段不是被平凡接受或平凡拒绝,则它会被窗口的某一个边界分成两个部分,其中一部分在窗口外,会被丢掉。剩下的部分有潜在可能性,对另一个边界重复操作。这个算法最多四次(四条边界)就会终止,出现平凡接受或平凡拒绝。
右边界截断示例
如上图,线段P1P2被窗口截断,需要对P1重新计算。它的x坐标显然是窗口右边界的位置,y坐标需要利用三角形相似性计算(向量计算)。

ddely
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值