课程
1121 字
约 4 分钟
大三下
lab03-line-rasterization 实验考点与编程专项练习
计算机图形学labs/review·更新于 2026-09-15
lab03-line-rasterization 实验考点与编程专项练习
一、 核心知识点整理
3.1 DDA 画线算法
- 微分思想:根据 进行迭代。
- 循环累加:只要 ,每步 加 1,浮点 值便累加斜率 。
- 离散舍入:必须在取像素时对浮点 进行四舍五入以映射为最贴近的像素位置:
int(y + 0.5)。
3.2 中点画线算法
- 中点比较思想:比较理想直线与两个待选像素的中点 的上下关系。
- 决策参数递推:
- 初始值 。
- 若 ,中点在直线上方,选择右侧像素 ,增量为 。
- 若 ,中点在直线下方,选择右上侧像素 ,增量为 。
3.3 Bresenham 画线算法
- 误差累积思想:用整数累积误差来判断哪一个点偏离最近。
- 完全避免浮点:
- 决策参数 。
- 若 ,当前像素 不变,更新为 。
- 若 ,像素 递增 1,更新为 。
二、 编程填空专项练习
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) 处进行 坐标四舍五入取整的代码为:( )
- 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) 处当 时的参数递推表达式为:( )
- A.
p += 2 * dy - 2 * dx; - B.
p += 2 * dy; - C.
p += dy; - D.
p += 2 * dx;
8. (8) 处当 时的参数递推表达式为:( )
- 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
- 解析:在 方向每递增 1 像素,根据直线方程对应的 增量应该为斜率 。
3.2 练习解析
【参考答案与解析】
3. 答案:
B
- 解析:在中点画线算法中,初始决策参数为 。
4. 答案:
D
- 解析:如果中点在直线上方(),选择正右侧像素,对应的增量为 ,即
d1。因此 A 和 C 均正确。5. 答案:
D
- 解析:如果中点在直线下方(),选择右上侧像素,对应的增量为 ,即
d2。因此 B 和 C 均正确。
3.3 练习解析
【参考答案与解析】
6. 答案:
A
- 解析:Bresenham 画线的初始判别值同样为 。
7. 答案:
B
- 解析:Bresenham 参数在 (说明偏向直线下方的 点)时, 不变,决策值累加 ,即
p += 2 * dy;。8. 答案:
D
- 解析:当 (偏向直线上方的 点)时, 递增 1,参数累计增量为 ,写成
2 * dy - 2 * dx或2 * (dy - dx)均可。













