基本概念
窗口/世界窗口:需要显示场景的区域,在世界坐标系/用户坐标系中定义
视口/视区:显示设备上用于显示图形的区域,设备坐标系/屏幕坐标系
裁剪:从场景中确定要呈现在视口的图形
视口与窗口的关系
二维图形的世界坐标系到设备坐标系的映射称为窗口到视区的变换或窗口变换
窗口变换流程:
世界坐标系内几何变换:
平移窗口到原点;放缩窗口使之与视区大小相等;平移使窗口与视区重合
裁剪 : 判断图形元素是否落在裁剪窗口之内并找出其位于内部的部分
裁剪的次序:
主要步骤:图元端点与窗口内外关系的判别
图元线段与窗口求交
直线段裁剪
(1)AB (2)EF---都在窗口左边的边界的外侧 (3)其他三条
特殊情况:线段两端点重合---点:
法一:直接求交算法
端点与窗口位置关系:
交点计算方法:
线段与窗口的边求交点;直线与窗口边都写成参数形式,求参数值
括号里的差值是指线段或窗口边的长度;式子的含义是点x与x0距离为t倍的总长度
只有当 s 和 t 同时落在[0, 1]区间上的交点才算有效交点
算法流程:
特点:直接易懂,速度慢---不能快速判断显然不可见的线段
法二:编码算法
步骤/思想:
注意第三步:求的是线段与窗口延长线的交点。有不懂的往下看
区域编码
把二维平面分成9个子区域,每个区域赋予一个四位编码 代表上下右左
线段端点编码:定义为它所在区域的编码
可以根据顶点编码判断线段与窗口的关系:
当两个端点的编码全为0时,线段完全可见
当线段的两个端点的编码的逻辑“与”非零时 ,线段为显然不可见的
对于那些非完全可见、又非显然不可见的线段,需要求交:
例:
对于一条线段:最多求交点次数为4,因为一条线段最多跨越四个区域
特点:对完全可见和显然不可见线段的快速判别;适用于大裁剪窗口和特小裁剪窗口;窗口可以不是四边形,可以拓展为任意凸多边形;算法复杂
法三:Liang-Barsky裁剪算法
基本思想:将二维裁剪化为一维裁剪,向X(或Y)方向投影以决定可见线段
多边形裁剪
主多边形:被裁剪的多边形 ; 裁剪多边形:裁剪窗口
需解决问题:主多边形被裁减后边界不再封闭,需要用裁剪窗口边界的恰当部分来封闭它,如何确定其边界?
S-H(逐边)裁剪算法 :按一定(如左上右下)的次序依次裁剪
多边形由顶点序列(有顺序)表示:V1V2…Vn
裁剪规则:
例: 注意:以上为例,最后一次的判别是(I6,I1),所以输出有个A
特点:算法简单,裁剪窗口可以推广到任意凸多边形