华南理工大学 梁宇正
老师教的直线段Bresenham扫描转换算法中直线段的两端均为整数,那么这里也同样假设 $c_x, c_y ,r $均为整数。公式推导时需要使用的是与圆心的相对坐标,所以只考虑圆心在原点的情况,其他情况只需要进行一个坐标偏移。
在 ([frac{pi}{4},frac{pi}{2}]) 的圆弧段中,圆切线的斜率范围为 ([-1,0]) ,仿照直线段Bresenham扫描转换算法,每次 (x_{i+1}=x_i+1) ,而因为斜率的范围的原因,所以 (y_{i+1}) 只有两种取法:(y_{i+1}=y_i) 或 (y_{i+1}=y_i-1) 。
考虑即将点亮的两个像素与圆的位置关系。一共有4种情况
当圆恰好穿过其中一个点时,点亮对应的点即可。
当两个点都在圆外时,(y_i-1) 的误差显然更小,选择 (y_{i+1}=y_i-1) 。
当两个点都在圆内时,(y_i) 的误差显然更小,选择 (y_{i+1}=y_i) 。
最后一种情况,点 ((x_i+1,y_i-1)) 在圆内,而 ((x_i+1,y_i)) 在圆外,比较他们与圆的误差关系。
首先我选择的“误差”是指点亮的点到圆心的距离与半径r的差的绝对值:
圆外的点 ((x_i+1,y_i)) 满足
$dH= sqrt{(x_i+1)2+y_i2} - R $
圆内的点 ((x_i+1,y_i-1)) 满足
(dL= R - sqrt{(x_i+1)^2+(y_i-1)^2})
仿照直线段Bresenham扫描转换算法,现在要比较 (dH) 和 (dL) 的大小关系,作差
判别式为
(Delta = dH- dL= sqrt{(x_i+1)^2+y_i^2} + sqrt{(x_i+1)^2+(y_i-1)^2} - 2R)
这个方法到这里我就做不下去了,貌似没有办法再化简了,而上面的方程和暴力使用方程计算没有分别。
考虑到两个像素实际上只有1个 (y) 坐标的差异,所以一个点在圆内一个点在圆外时,点到圆心的距离与半径 (r) 的差必定不超过1。
因为在 (x_1∈[0,1]) ,且 (x_2∈[0,1]) 时,假如 (x1>x2) 必有 (x1^2>x2^2) ,根据这个性质我认为可以改作比较点到圆心的距离与半径 (r) 的差的平方。
最后我把“误差”定为点亮的点到圆心的距离的平方与半径 (r) 的平方的差,则有:
圆外的点 ((x_i+1,y_i)) 满足
(dH= (x_i+1)^2+y_i^2 – R^2)
圆内的点 ((x_i+1,y_i-1)) 满足
(dL= R^2 - (x_i+1)^2-(y_i-1)^2)
仿照直线段Bresenham扫描转换算法,现在要比较 (dH) 和 (dL) 的大小关系,作差,判别式为
(Delta = dH- dL= (x_i+1)^2+y_i^2 + (x_i+1)^2+(y_i-1)^2 - 2R^2)
定义第 (i) 个点有 (p_{i}= x_i^2+y_i^2 – 2R^2)
则上式可化简为
(egin{align}
Delta&= x_i^2+2x_i+1+y_i^2 +x_i^2+2x_i+1+y_i^2-2y_i+1 - 2R^2\
&=2p_i+4x_i -2y_i+3\
end{align})
那么根据 $Delta $ 的符号就可以确定选择哪个点了。但是看起来还是有多余的计算,设一个 (q_i=2p_i+4x_i -2y_i) ,那么只需要比较 (Delta=q_i+3) 的符号就可以了。
再考虑如何从 (q_i) 推导出 (q_{i+1}) :
当选择点 ((x_i+1,y_i)) 时,得
新的点:
(egin{align}
q_{i+1}&=2((x_i+1)^2+y_i^2 – 2R^2)+ 4(x_i+1)-2y_i\
&=2x_i^2+2 y_i^2+8 x_i-2y_i+6-4R^2
end{align})
旧的点:
(egin{align}
q_{i}&=2p_i+4x_i -2y_i\
&=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i\
end{align})
两式作差得:
(q_{i+1}- q_{i}=4x_i+6=4x_{i+1}+2)
当选择点 ((x_i+1,y_i-1)) 时,得
新的点:
(egin{align}
q_{i+1} &= 2((x_i+1)^2+(y_i-1)^2 – 2R^2)+ 4(x_i+1)-2(y_i-1)\
&=2 x_i^2+2 y_i^2+8 x_i-6y_i+10-4R^2
end{align})
旧的点:
(egin{align} q_i&=2p_i+4x_i -2y_i\ &=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i end{align})
两者作差得:
(q_{i+1}- q_{i}=4x_i-4y_i+10=4x_{i+1}-4y_{i+1}+10)