计算机图形学 裁剪算法


在家听网课的第三章。
中国农业大学赵明老师。

直线裁剪算法

屏幕不够大,只显示图形的一部分
如上图,屏幕显示的只是图形的一部分。需要确定图形哪些部分落在显示区之内,哪些落在显示区之外。

选择的过程就称为裁剪

暴力裁剪法

最暴力的裁剪方法:判断图形所有的点是不是都在窗口内。

点的裁剪

判断点是不是在蓝框框里
只要点的x,y满足在窗口矩形区域内的条件(x≤x≤x且y≤y≤y),就可取。

线的裁剪

判断直线段与窗口的关系

线有三种可能

  1. 全部在窗口:EF
  2. 全部在窗口:IJ,CD
  3. 与窗口边界相交:AB,GH
    如果相交,则计算它与边界的交点(以确定这条线段的哪一部分可显示)。

三个算法

以下。

Cohen Sutherland算法/编码裁剪算法——通过二进制编码及运算,对直线与窗口的关系进行分类。

处理方法

分三类处理线段

1.简取

简取
线段两端点都在窗口内时,线段必全在窗口内。

2.简弃

简弃
线段两端点全在窗口左边/右边/上面/下面时,线段必在窗口外

3.既不简取也不简弃

对直线段按照交点进行分段,分段后判断直线是简取还是简弃

编码

线段的两个端点赋四位二进制码 D3D2D1D0.
D3D2D1D0代表的意义如图
分别代表什么意义
赋值准则
0?1?

运算
  1. 运算为0,则直线段简取;
  2. 运算非0,则直线段简弃;
  3. 若两条件均不成立,则直线段要被一分为二,需求出直线段与窗口边界的交点,进行取舍。

适用范围

  1. 大部分线段完全可见时;
  2. 大部分线段完全不可见时。

中点分割法——二分逼近的方法确定直线段与窗口的交点

处理方法

不断求线段的中点,逼近交点 (直到中点与窗口边界的坐标值在规定的误差范围内相等)。

中点不在窗口内

中点在窗口外
舍弃中点和离窗口边界最远点构成的线段。

中点在窗口内

中点在窗口内
舍弃中点和离窗口边界最近点构成的线段。

Liang Barsky算法——直线方程参数化、给直线赋方向

  1. p1 = -Δx, q1 = x1-xleft
  2. p2 =+Δx, q2 = xright-x1
  3. p3 = -Δy, q3 = y1-ybottom
  4. p4 =+Δy, q4 = ytop-y1

u*pk≤qk,其中k=1,2,3,4
入边:左边和下边(1,3)
出边:右边和上边(2,4)

算法分析

Pk=0时

  1. 当P1=P2=0时:表示直线平行于y轴平行于y轴
  2. 当P1=P2=0时:表示直线平行于x轴
    平行于x轴
若此时还满足qk<0,则线段完全在边界外,舍弃该线段。

边界外

若此时满足qk≥0,则进一步判断。

若Δx=0(p1=p2=0),有q1≥0且q2≥0;
若Δy=0(p3=p4=0),有q1≥0且q2≥0;
公式

Pk!=0时

Pk<0时

线段从裁剪边界延长线的外部延伸到内部,有入边交点

Pk>0时

线段从裁剪边界延长线的内部延伸到外部,有出边交点

Uk=qk/pk(pk!=0,k=1,2,3,4)

Umax=max(0,Uk|pk<0,Uk|pk<0)
Umin=min(Uk|pk<0,Uk|pk<0,1)
  1. 若Umax> Umin,则直线段在窗口外,删除该直线。
  2. 若Umax Umin,则将Umax和Umin代入直线参数方程,求出两个交点坐标。

注:

  1. 直线参数方程:
    x=x1+U*(x2-x1)
    y=y1+U*(y2-y1)
  2. 对于实交点,有0≤U≤1,注意Umax和Umin的范围限定。
发布了9 篇原创文章 · 获赞 3 · 访问量 214

猜你喜欢

转载自blog.csdn.net/weixin_44491160/article/details/104228730