Bresenham 算法画线 & 画圆
最近作业在做 graphics driver 涉及到 Bresenham 画线以及画圆算法,以防自己忘记了总结一些知识点以及源码。 所有代码的输入参数类型都是 unsinged int Bresenham 直线算法 在给出直线两个端点(x1, y1) 和 (x2, y2) 的情况下,选取 (x1, y1) 作为起始点, 依次确认相应的像素点。选取哪个端点作为起点是没有关系的,因为线段并不存在方向这一说,只是和斜率有关系,下面会提到。 以点 (x i , y i ) 为例,以 y 为步进单位, (x i , y i ) 的下一个像素点为 (x i +1, y i +1) 和 (x i +1, y i ) 中的一个点,那么为了确认到底应该选哪一个点,这时就要比较垂直距离 d1 和 d2 的关系。设直线的方程为 y = kx + b,其中 k=Δy/Δx, Δy = abs(y2 - y1), Δx = abs(x2 - x1)。此时 , , 接下来可以得到 在上面这个表达式中,可以发现我们涉及到了除法运算,为了消除除法运算可能引入的误差,在等式两边同时乘 Δx, 并命名为一个新的变量 其中c是最终化简得到的总的常数。此时 pi 和(d1 - d2) 同号,我们可以根据 pi 的正负来判断下一个像素点的位置: 当 pi > 0 时, d1 > d2, , 当 pi <= 0 时,d1 <