圆弧的扫描转换算法
- 处理对象:圆心在原点、半径为R的圆
- 圆的八对称性:
一、 直接算法
两种直接离散方法:
- 利用隐函数方程: x 2 + y 2 = R 2 x^2 + y^2 = R^2 x2+y2=R2
( x i , y i = R 2 − x i 2 ) 取 整 > ( x i , y i , r ) (x_i, y_i = \sqrt{R^2 - x_i^2}) \frac{取整}{}>(x_i, y_{i,r}) (xi,yi=R2−xi2)取整>(xi,yi,r) - 利用参数方程: { x = R cos θ y = R sin θ \begin{cases}x = R\cos{\theta} \\ y = R\sin{\theta} \end{cases} { x=Rcosθy=Rsinθ
这两种方法都不可取,因为分别用到了开根运算、三角函数运算、浮点运算、取整等,计算量大,效率不高,不均匀。
二、角度DDA算法
由圆的参数方程:
{ x = R cos θ y = R sin θ \begin{cases} x = R\cos{\theta} \\ y = R\sin{\theta} \end{cases} {
x=Rcosθy=Rsinθ
取微分:
{ d x = − R sin θ d θ d y = R cos θ d θ ⇒ { d x = − y d θ d y = x d θ \begin{cases} dx = -R\sin{\theta}d\theta \\ dy = R\cos{\theta}d\theta \end{cases} \Rightarrow \begin{cases} dx = -yd\theta \\ dy = xd\theta \end{cases} {
dx=−Rsinθdθdy=Rcosθdθ⇒{
dx=−ydθdy=xdθ
三、中点算法
利用圆的对称性,只须讨论 1 8 \frac{1}{8} 81圆。考虑第一象限内 x ∈ [ 0 , R 2 ] x \in[0, \frac{R}{\sqrt{2}}] x∈[0,2R]的圆弧:
P ( x p , y p ) P(x_p,y_p) P(xp,yp)为当前点亮像素,那么下一个点亮的像素可能是 P 1 ( x p + 1 , y p ) P_1(x_p+1, y_p) P1(xp+1,yp)或 P 2 ( x p + 1 , y p − 1 ) P_2(x_p + 1, y_p - 1) P2(xp+1,yp−1)
- 设 M M M为 P 1 、