计算机图形学初步

华南理工大学 梁宇正

老师教的直线段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)

原文地址:https://www.cnblogs.com/Inko/p/11552889.html