- 进一步说,对于一些几何,我们还只是有数学的抽象表达,但实际的图像确实离散的像素点
- 所以光栅化其实就是把数学表达转化为像素表达,得到的数据我们称为“片段”,用于进一步的片段处理
线段的扫描转换
- 对于线段来说,其数学描述只是两个顶点(x1,y1)和(x2,y2)
- 这两个顶点自然可以很容易的对应两个像素点,但这两个顶点的连线也应该对应着若干个像素点才行
- 这里默认像素位置均为整数,尽管也有不是整数的情况
DDA算法
- 一个很显然的思路,就是求出线段的斜率,然后递增x,y每次加上斜率并取整
- 设x1 < x2
DDA(int x1,int y1,int x2,int y2){
int x = 0;
double y = y1, m = (y2-y1)/(double)(x2-x1);
for(x=x1;x<=x2;++x){
y += m;
output(x,(int)y);
}
}
- 但是这样写仅对于 0<=|m|<=1 的情况才能得到连续的像素位置
- 对于 |m|>1 的情况就 递增y 就行了呗
Bresenham算法
- DDA涉及了大量的浮点运算,这样很耗时间的
- 如果能有完全是整数运算的就好了,那肯定是快很多啊
分析一下线段的转换,只考虑 0 < m < 1的情况,其余的对称
对于已经确定的点p,其下一个要选择的点
- 如果是绿色线,则更靠近m,则选择m
- 如果是红色线,则更靠近n,则选择n
- 就是说,下一个选择只有两个选择,如何选择就看线段更靠近那个点