0

我正在学习计算机图形学,遇到了 Cohen-Sutherland 线裁剪算法。我们有一个由点定义的线段P1P2并且我们试图找出它是否被裁剪在裁剪矩形内(通常由屏幕的宽度和高度定义,左上角是 [0, 0])

该算法很简单,我们只需检查每个点以查看该点的 x 和 y 是否超出范围:

if (y1 < min_clip_y)
        p1_code |= CLIP_NORTH;
else if (y1 > max_clip_y)
        p1_code |= CLIP_SOUTH;

if (x1 < min_clip_x)
        p1_code |= CLIP_WEST;
else if (x1 > max_clip_x)
        p1_code |= CLIP_EAST;

// Same deal with x2, y2

如果两者p1_codep2_code都不等于零,我们拒绝该线,如果它们都为零,我们接受它,否则我们继续测试以找到与裁剪矩形相交边缘的裁剪交点:

switch(p1_code)
{
    case CLIP_NORTH:
    {
         yc1 = min_clip_y;
         xc1 = x1 + 0.5f + (min_clip_y - y1) * (x2-x1) / (y2-y1);
    } break;

    // other cases...
}

我从一本书中读到这个。我理解我们如何推导出 x 截距的方程,我只是不明白为什么我们要添加 0.5f 来舍入到下一个整数。为什么我们需要四舍五入?

谢谢!

4

1 回答 1

0

许多计算机图形文本都有这样的错误。CS 是在大约 50 年前发明的,当时浮点比整数数学要慢得多,所以规范是使用整数算术或整数指令来模拟定点。结果是对旧代码进行了奇怪的重新实现,用浮点移植了旧的定点。这显然是其中之一。

正如您所怀疑的那样,您希望使用浮点进行整个计算,然后在最后绝对需要时四舍五入到最近的像素。但是对于现代 GPU,您甚至可以跳过它,因为抗锯齿线条绘制可以使用浮点坐标做正确的事情。

事实上,奇怪的是图形文本仍然如此突出地使用线条剪辑,因为现代图形更多地是关于多边形。有很多不错的三角形和多边形算法,它们比线裁剪更具有实际意义。太多的教科书作者是他们学徒工具的奴隶。

于 2016-02-21T03:26:55.180 回答