我正在研究计算机图形学并且遇到了Cohen-Sutherland线裁剪算法。我们有一个由点P1
和P2
定义的线段,我们试图找出它是否在剪切矩形内被剪切(通常由屏幕的宽度和高度定义,并且左上角是[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_code
和p2_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来舍入到下一个整数。为什么我们需要围绕?
谢谢!
答案 0 :(得分:0)
许多计算机图形文本都有这样的错误。 C-S是在大约50年前发明的,当浮点比整数数学慢得多时,因此常规是使用整数运算或整数指令来模拟定点。结果是,旧代码有一些奇怪的重新实现,它们使用浮点移植旧的固定点。这显然是其中之一。
正如您所怀疑的那样,您希望使用浮点进行整个计算,然后如果最后需要,则舍入到最近的像素。但是对于现代GPU,您甚至可以跳过这一点,因为反锯齿线绘制可以使用浮点坐标做正确的事情。
事实上,奇怪的是,图形文本仍然突出显示线条剪裁,因为现代图形更多地是关于多边形。有许多漂亮的三角形和多边形算法比线条剪切更具实用意义。太多的教科书作者是他们学徒工具的奴隶。