视频加载失败

课程

1121 字
约 4 分钟

lab03-line-rasterization 实验考点与编程专项练习

计算机图形学labs/review·更新于 2026-09-15

lab03-line-rasterization 实验考点与编程专项练习


一、 核心知识点整理

3.1 DDA 画线算法

  • 微分思想:根据 y1y0=k(x1x0)y_1 - y_0 = k(x_1 - x_0) 进行迭代。
  • 循环累加:只要 0k10 \le k \le 1,每步 xx 加 1,浮点 yy 值便累加斜率 kk
  • 离散舍入:必须在取像素时对浮点 yy 进行四舍五入以映射为最贴近的像素位置:int(y + 0.5)

3.2 中点画线算法

  • 中点比较思想:比较理想直线与两个待选像素的中点 M(xp+1,yp+0.5)M(x_p + 1, y_p + 0.5) 的上下关系。
  • 决策参数递推
    • 初始值 d0=2ΔyΔxd_0 = 2\Delta y - \Delta x
    • di<0d_i < 0,中点在直线上方,选择右侧像素 (xp+1,yp)(x_p + 1, y_p),增量为 dnew=dold+2Δyd_{new} = d_{old} + 2\Delta y
    • di0d_i \ge 0,中点在直线下方,选择右上侧像素 (xp+1,yp+1)(x_p + 1, y_p + 1),增量为 dnew=dold+2Δy2Δxd_{new} = d_{old} + 2\Delta y - 2\Delta x

3.3 Bresenham 画线算法

  • 误差累积思想:用整数累积误差来判断哪一个点偏离最近。
  • 完全避免浮点
    • 决策参数 p0=2ΔyΔxp_0 = 2\Delta y - \Delta x
    • pi<0p_i < 0,当前像素 yy 不变,更新为 pnew=pi+2Δyp_{new} = p_i + 2\Delta y
    • pi0p_i \ge 0,像素 yy 递增 1,更新为 pnew=pi+2Δy2Δxp_{new} = p_i + 2\Delta y - 2\Delta x

二、 编程填空专项练习

3.1 DDA 画线算法练习

void DrawLineDDA(int x0, int y0, int x1, int y1, Color c)
{
    int dx = x1 - x0;
    int dy = y1 - y0;
    float y = y0;
    float k = (float)dy / dx; // 直线斜率

    for (int x = x0; x <= x1; x++)
    {
        SetPixel(x, (1), c); // 绘制四舍五入后的 y 像素
        (2); // $y$ 坐标累加斜率值
    }
}

1. (1) 处进行 yy 坐标四舍五入取整的代码为:(  )

  • A. (int)y
  • B. (int)(y + 0.5)
  • C. (int)(y + 1.0)
  • D. y

2. (2) 处 DDA 的递推更新公式为:(  )

  • A. y += 1;
  • B. y += k;
  • C. y += 1.0f / k;
  • D. y = y + 1;

3.2 中点画线算法练习

void DrawLineMidpoint(int x0, int y0, int x1, int y1, Color c)
{
    int dx = x1 - x0;
    int dy = y1 - y0;
    int y = y0;
    int d = (3); // 初始判别参数值
    int d1 = 2 * dy;
    int d2 = 2 * (dy - dx);

    for (int x = x0; x <= x1; x++)
    {
        SetPixel(x, y, c);
        if (d < 0)
        {
            (4); // 更新 d 值,y 轴不变
        }
        else
        {
            y++;
            (5); // 更新 d 值,y 轴递增 1
        }
    }
}

3. (3) 处需要填入的初值决策参数为:(  )

  • A. dy - dx
  • B. 2 * dy - dx
  • C. 2 * dx - dy
  • D. 2 * dy

4. (4) 处选择正右侧像素时的决策更新公式为:(  )

  • A. d += d1;
  • B. d += d2;
  • C. d += 2 * dy;
  • D. A 和 C 均正确

5. (5) 处选择右上侧像素时的决策更新公式为:(  )

  • A. d += d1;
  • B. d += d2;
  • C. d += 2 * (dy - dx);
  • D. B 和 C 均正确

3.3 Bresenham 画线算法练习

void DrawLineBresenham(int x0, int y0, int x1, int y1, Color c)
{
    int dx = x1 - x0;
    int dy = y1 - y0;
    int y = y0;
    int p = (6); // 初始判别参数

    for (int x = x0; x <= x1; x++)
    {
        SetPixel(x, y, c);
        if (p < 0)
        {
            (7); // 决策递进公式,y 不变
        }
        else
        {
            y++;
            (8); // 决策递进公式,y 递增
        }
    }
}

6. (6) 处需要填写的初始判别变量代码为:(  )

  • A. 2 * dy - dx
  • B. dy - dx
  • C. 2 * dx - dy
  • D. 2 * dy

7. (7) 处当 p<0p < 0 时的参数递推表达式为:(  )

  • A. p += 2 * dy - 2 * dx;
  • B. p += 2 * dy;
  • C. p += dy;
  • D. p += 2 * dx;

8. (8) 处当 p0p \ge 0 时的参数递推表达式为:(  )

  • A. p += 2 * dy;
  • B. p += 2 * dy - 2 * dx;
  • C. p += 2 * (dy - dx);
  • D. B 和 C 均正确

三、 答案与解析

3.1 练习解析

【参考答案与解析】

1. 答案:B

  • 解析:浮点数转整数的四舍五入可以通过强制转换为 (int) 之前加上 0.5 达成。

2. 答案:B

  • 解析:在 xx 方向每递增 1 像素,根据直线方程对应的 yy 增量应该为斜率 kk

3.2 练习解析

【参考答案与解析】

3. 答案:B

  • 解析:在中点画线算法中,初始决策参数为 d0=2ΔyΔxd_0 = 2\Delta y - \Delta x

4. 答案:D

  • 解析:如果中点在直线上方(d<0d < 0),选择正右侧像素,对应的增量为 2Δy2\Delta y,即 d1。因此 A 和 C 均正确。

5. 答案:D

  • 解析:如果中点在直线下方(d0d \ge 0),选择右上侧像素,对应的增量为 2(ΔyΔx)2(\Delta y - \Delta x),即 d2。因此 B 和 C 均正确。

3.3 练习解析

【参考答案与解析】

6. 答案:A

  • 解析:Bresenham 画线的初始判别值同样为 p0=2ΔyΔxp_0 = 2\Delta y - \Delta x

7. 答案:B

  • 解析:Bresenham 参数在 p<0p < 0(说明偏向直线下方的 SS 点)时,yy 不变,决策值累加 2Δy2\Delta y,即 p += 2 * dy;

8. 答案:D

  • 解析:当 p0p \ge 0(偏向直线上方的 TT 点)时,yy 递增 1,参数累计增量为 2Δy2Δx2\Delta y - 2\Delta x,写成 2 * dy - 2 * dx2 * (dy - dx) 均可。
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录