为什么我们需要在Cohen-Sutherland裁剪算法中计算水平线的x截距时进行舍入?

时间:2016-02-21 02:54:08

标签: algorithm rounding clipping line-segment

我正在研究计算机图形学并且遇到了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来舍入到下一个整数。为什么我们需要围绕?

谢谢!

1 个答案:

答案 0 :(得分:0)

许多计算机图形文本都有这样的错误。 C-S是在大约50年前发明的,当浮点比整数数学慢得多时,因此常规是使用整数运算或整数指令来模拟定点。结果是,旧代码有一些奇怪的重新实现,它们使用浮点移植旧的固定点。这显然是其中之一。

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

事实上,奇怪的是,图形文本仍然突出显示线条剪裁,因为现代图形更多地是关于多边形。有许多漂亮的三角形和多边形算法比线条剪切更具实用意义。太多的教科书作者是他们学徒工具的奴隶。