本文整理自西安交通大学软件学院祝继华老师的计算机图形学课件,请勿转载
圆弧的扫描转换算法
圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的像素集
以圆心在原点、半径R为整数的圆为例,讨论圆的生成算法。假设圆的方程为:
X
2
+
Y
2
=
R
2
X^2+Y^2=R^2
X2+Y2=R2
圆弧扫描算法
基本思想:
使用公式计算得到每个点的Y值: Y = ± s q r t ( R 2 − X 2 ) Y=\pm sqrt(R^2-X^2) Y=±sqrt(R2−X2)
在一定范围内,每给定一个X值,就可以求得一个Y值
缺点:浮点运算,取整导致不均匀
角度DDA法
x n + 1 = x n + d x ; y n + 1 = y n + d y x = x 0 + R cos θ ; y = y 0 + R sin θ d x = − R sin θ d θ ; d y = R cos θ d θ x n + 1 = x n + d x = x n − R sin θ d θ = x n − ( y n − y 0 ) d θ y n + 1 = y n + d y = y n + R cos θ d θ = y n + ( x n − x 0 ) d θ x_{n+1} =x_n + dx;\ \ \ y_{n+1} =y_n + dy \\ x = x_0 + R\cos \theta;\ \ \ y = y_0 + R\sin \theta\\ dx =- R\sin \theta d\theta;\ \ \ dy = R\cos\theta d\theta \\ x_{n+1} = x_n + dx = x_n - R\sin\theta d\theta =x_n - (y_n - y_0 )d\theta \\ y_{n+1} = y_n + dy = y_n + R\cos\theta d\theta =y_n + (x_n - x_0 )d\theta\\ xn+1=xn+dx; yn+1=yn+dyx=x0+Rcosθ; y=y0+Rsinθdx=−Rsinθdθ; dy=Rcosθdθxn+1=xn+dx=xn−Rsinθdθ=xn−(yn−y0)dθyn+1=yn+dy=yn+Rcosθdθ=yn+(xn−x0)dθ
确定x,y的初值以及 d θ d\theta dθ值后,就可以根据增量方式获得圆周上的坐标,然后取整可以获得想说坐标
但是需要采用浮点运算、除法运算、取整运算
中心画圆法
考虑中心在原点,半径为R的第二个8分圆
- 构造判别式(原方程)
- 如果d<0,则取P1为下一像素,而且下一像素的判别式为
- 如果d>0,则取P2为下一像素;而且下一像素的判别式为
- 第一像素是(0,R),判别式d的初始值为
优化
用e=d-0.25代替d去掉浮点数:
- 初始值:d0=1.25–R 对应于e0=1-R
- 判别式:d<0对应于e<-0.25(因为e的初值e0为整数,运算过程中的增量 2 ( x p − y p ) + 5 2(x_p-y_p)+5 2(xp−yp)+5或 2 x p + 3 2x_p+3 2xp+3也为整数,故e始终为整数,所以e<-0.25 等价于e<0)
void MidPointCircle(int r, int color)
{
int x,y,d;
x=0; y=r; e=1-r; // 初值e=1-r
Circlepoints (x,y,color); // 画八分对称性的其他点
while(x<=y) { // 画到直线x=y结束
if(e<0) e+=2*x+3; // 取右侧点
else { e+=2*(x-y)+5; y--;} // 取右下点
x++;
Circlepoints (x,y,color); // 画八分对称性的其他点
}
}
例子
其他算法
- Bresenham画圆算法
- 生成圆弧的正负法