图形裁剪
字数: 0
是用于确定图像中哪些部分位于视窗 (Viewport) 内部或外部的过程。
在计算机图形学中,计算机屏幕充当一个二维坐标系。一个物体 / 场景的每一个点都能在计算机屏幕上显示出来是不可能的。我们只能看到位于特定范围内的点。
裁剪窗口的边界:$x_{\text{wmin}}, x_{\text{wmax}}, y_{\text{wmin}}, y_{\text{wmax}}$
裁剪窗口的边界:

点裁剪

判断一个点是否位于指定的裁剪区域内部,并据此决定是否保留该点的过程。
在二维图形中,一个点的坐标 需要满足以下条件,才能被视为位于裁剪窗口内:
  1. 左边界
  1. 右边界
  1. 下边界
  1. 上边界
如果点满足上述所有条件,则该点在裁剪区域内;否则,该点被裁剪掉。
notion image
notion image

线裁剪

用于确定和裁剪一条线段,使其完全位于窗口内。
  1. if completely inside
  1. if completely outside
  1. if not completely inside or outside → intersection calculation

Cohen Sutherland 算法

基本过程

  1. 将视窗划分为 个相等的区域
  1. 对裁剪窗口及其外部区域进行编码
      • 每个点根据其位置分配一个 位的二进制码。
      • 位的分配取决于 “TBRL”(上、下、右、左)规则。
      • 如果一个点位于某个特定的角落位置,则该角落的值为 ,否则为
      notion image
      notion image
  1. 分类线段
      • 完全可见:如果两个端点的区域代码都是 0000(即在线内),直接绘制整条线段。
      • 完全不可见:如果两个端点的区域代码 AND 操作的结果不为 0000,则线段完全在窗口外,可以直接丢弃。
      • 部分可见:如果两个端点的区域代码 AND 结果为 0000 且至少一个端点的编码不是 0000,则线段需要裁剪。
        • notion image
        • 完全可见
        • 完全不可见
        • 部分可见 / 需要裁剪
  1. 裁剪线段:对部分可见的线段,按照以下步骤裁剪:
      • 从窗口边界开始,使用区域编码找到线段与窗口边界的交点。
      • 用「交点」替代窗口外的端点,更新区域编码。
      • 重复上述过程,直到线段完全位于窗口内或被判定不可见。
      • 是线段的斜率
      • 是线段的两个端点
      • 是线段所在直线的一般方程
    1. 裁剪上边界:固定 ,求
    2. 裁剪下边界:固定 ,求
    3. 裁剪右边界:固定 ,求
    4. 裁剪左边界:固定 ,求

例题

裁剪窗口:
线段端点
  • 起点:
  • 终点:

,需要裁剪左边界:
裁剪后,线段的「新起点」为

,需要裁剪右边界:
裁剪后,线段的「新终点」为

Liang Barsky 算法

比 Cohen Sutherland 算法更为高效,使用了「参数方程」,避免了多次交点计算

基本过程

线段起点为 ,终点为
  1. 计算
      • 左边界
      • 右边界
      • 下边界
      • 上边界
  1. 计算 (Time interval),表示线段在裁剪窗口内的有效区间。
      • 起点:
      • 终点:
  1. 计算参数方程
    1. 检查线段和边界相交情况:对于每一个边界 ,进行以下步骤
      1. 如果 (即线段与边界平行),检查线段是否完全在边界内:
          • ,则线段完全在边界外,需要丢弃该线段。
          • ,则线段完全在边界内,保持该线段。
      2. 如果 ,计算线段与边界的交点
          • ,则线段进入了窗口,更新 (取二者最大值)
          • ,则线段离开了窗口,更新 (取二者最小值)
    1. 裁剪线段:在计算完
      1. 如果 ,表示线段与窗口相交,裁剪后的线段的端点为:
        1. 如果 ,表示线段完全在窗口外,丢弃该线段。

      中点细分算法

      Midpoint Subdivision,基于「迭代」分割线段的方法

      基本过程

      线段起点为 ,终点为
      1. 使用 Cohen Sutherland 的区域代码方法判断线段是否:
        1. 完全可见:直接输出该线段
        2. 完全不可见:直接丢弃该线段
        3. 部分可见:进入下一步处理
      1. 计算中点
        1. 更新线段:根据中点的位置,将线段分成两个子线段
            • 子线段 1:从
            • 子线段 2:从
            • 对于每个子线段,重复步骤 2 和步骤 3。
            • 当线段的长度足够短(例如小于一个像素),停止递归处理。

        多边形裁剪

        Sutherland Hodgeman 算法

        notion image
        多边形的顶点序列
         
        从左边界开始,依次对多边形进行左、右、下、上四次裁剪,剩余的顶点序列描述了裁剪后的多边形。
        左侧裁剪
        左侧裁剪
        右侧裁剪
        右侧裁剪
        顶部裁剪
        顶部裁剪
        底部裁剪
        底部裁剪

        基本过程

        1. 两个端点都在裁剪窗口内:保留整条边。
        1. 两个端点都在裁剪窗口外:丢弃整条边。
        1. 一个端点在窗口内,另一个端点在窗口外:将交点与窗口内的端点连接,形成一条新边。
        notion image

        Weiler Atherton 算法

        利用多边形来裁剪另一个多边形的方法
        notion image

        基本过程

        1. 创建两个列表
            • 被裁剪多边形列表:按顺序写下被裁剪的多边形 (Subject Polygon) 的顶点
            • 裁剪窗口列表:按顺序写下裁剪窗口 (Clipped Polygon ) 的顶点
        1. 创建交点列表 (A list for intersection points)
          1. (交点的计算依通常涉及判断两条线段是否相交,并计算坐标)
            • 从第一个交点起点出发,沿着被裁剪多边形列表的顶点前进
            • 遇到裁剪窗口的边,切换到另一个列表,沿着它的顶点前进
            • 当回到起点时结束
        1. 构建裁剪后的多边形:根据交点和原多边形的边,按顺时针或逆时针方向重新排列顶点,形成裁剪后的多边形。

        例题

        Subject Polygon
        Clipped Polygon
        (Start)
        (End)
        (End)
        (Start)
        notion image
        notion image
        最后生成两个新多边形

        文本裁剪

        All-or-none string-clipping

        • 如果整个字符串完全在裁剪窗口内,保留它。
        • 否则,丢弃该字符串。
        notion image

        All-or-none character-clipping

        • 只丢弃那些完全位于窗口外的字符部分。
        notion image

        Individual characters clipping

        • 裁剪单个字符的组成部分。
        notion image
        2023 - 2026