计算机图形学-直线裁剪算法

简弃

就是线段完全在窗口外
在这里插入图片描述

简取

直线完全在窗口内
在这里插入图片描述

Cohen-Suthland算法

核心思想

对直线段两端端点进行编码 再进行求或求与操作从而判断是否简弃或简取
在这里插入图片描述
将每条线段的端点都赋予四位二进制编码D3D2D1D0
若x<xleft 则D0= 1 否则D0 = 0
若x<xright 则D1= 1 否则D1 = 0
若x<xbotton 则D2= 1 否则D2 = 0
若x<x~ top~ 则D3= 1 否则D3 = 0
再将窗口变成9个区域
D0对应左边界
D1对应右边界
D2对应下边界
D3对应上边界
如果两条线段进行或运算|
code1|code2 = 0则对直线进行简取

如果两条线等进行与运算&
code1&code2 != 0则对指向进行简弃

当这两个条件都不满足是 就是不能简取或者简弃时
需要求出直线段和窗口边间的交点 在交点处把线段一分为二
在这里插入图片描述
再按 左 右 下 上的顺序求出直线段与窗口做边界的交点为p3
则p1p3必在窗口外 可简弃
重复对p2p3进行操作

优点

如果线段大部分在窗口外 或者大部分在窗口内 很少贯穿的线段 则效率很高

缺点

在这里插入图片描述

中点分割法

核心思想

与Cohen-Suthland算法类似 端两个端点进行编码
但是他与众不同的地方在于 求交方式是采用二分法逼近在这里插入图片描述
不断地进行二分
在这里插入图片描述
几个情况
1.如果求得中点不在窗口内则将里窗口更远端的那个端点和中点所组成线段进行简弃 也就是上上面那张图中的p3和p2组成线段
2.如果中点在窗口内 则以中点和离窗口最远端点组成线段 并再求其中点 直到中点与窗口边界的坐标值在规定的误差范围内相等

Liang-Barsky裁剪算法

核心思想

用参数方程表示一条直线

在这里插入图片描述
x = x1 + u . (x2 - x1) = x1 +deltx . u 0 <= u <= 1
y = y1 + u . (y2 - y1) = y1 +delty . u 0 <= u <= 1
deltx = x2 - x1
(x1,y1) (x2,y2)是线段的两个端点
这里表示的是一个直线段 如果表示直线 u的范围就是负无穷到正无穷
u就是参数方程中的自变量

将线段看成有方向的 把窗口四条边分成两类

在这里插入图片描述
会发现直线和入边有两个交点 和出边有两个交点 一共六个点
入边交点和起始点三个点中取u值最大的那个点 也就是图中绿色的起始点作为裁剪线段的起始点
出边交点和终点三个点中取u值最小的那个点 也就是图中出边上那个粉红色的点作为裁剪线段的终点

点要在窗口内的条件

下面的式子是将他化简
在这里插入图片描述
再简化
在这里插入图片描述
u.Pk<=qk k = 1,2,3,4

结论

当Pk = 0 且qk < 0 时 线段完全在窗口外

也就是 deltx或者delty为0 表示这是一条竖直或者水平的直线
而qk<0表示起始端点在窗口的上边 左边右边 下边在这里插入图片描述

当Pk != 0 且qk < 0 时 线段从外向内延伸

Pk != 0表示是一根斜线 qk<0表示起始点在窗口外 因为k一定要一致

当Pk != 0 且qk> 0 时 线段从内向外延伸
当Pk < 0 对应入边交点
当Pk >0 对应出边交点
找到裁剪线段的两个端点

交点u值为 uk = qk/pk
把Pk<0的两个交点u值和0(u值为0的是线段的起始点)这三个值进行比较 找最大的Umax (Umax是被裁剪后线段的起始点的u值)
把Pk>0的两个交点u值和1(u值为11=是线段的终点)这值进行比较 找最小Umin (Umin是被裁剪后线段的终点的u值)
若Umax>Umin则直线段在窗口外 删除该直线
若若Umax<=Umin则将 Umax和Umin代回直线参数方程 求出直线与窗口的两实交点坐标

裁剪步骤

1.获取两个端点坐标 和窗口边界值
2.若deltx == 0 则P1=P2 =0 进一步判断q1<0或q2<0
若满足则直线不在窗口内 直接简弃
若不满足 既 q1>=0或q2>=0则进一步计算Umax和Umin
3.同样计算delty同样步骤 也就是P3=P4=0的情况
4.若Pk!=0 则计算Umax和Umin
5.求得Umax和Umin 若Umax>Umin则线段在窗口外 否则将Umax和Umin代入参数方程 获取裁剪后起始点和终点坐标
x = x1 + u . (x2 - x1)
y = y1 + u . (y2 - y1)

例子

在这里插入图片描述
在这里插入图片描述
将Umax和Umin带入得(3,7)和(3,8)在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值