三种圆弧的扫描转换算法

本文整理自西安交通大学软件学院祝继华老师的计算机图形学课件,请勿转载

圆弧的扫描转换算法

圆的特征:八对称性。只要扫描转换八分之一圆弧,就可以求出整个圆弧的像素集

image-20220213195919862

以圆心在原点、半径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(R2X2)

在一定范围内,每给定一个X值,就可以求得一个Y值

缺点:浮点运算,取整导致不均匀

image-20220213200138804

角度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=xnRsinθdθ=xn(yny0)dθyn+1=yn+dy=yn+Rcosθdθ=yn+(xnx0)dθ

确定x,y的初值以及 d θ d\theta dθ值后,就可以根据增量方式获得圆周上的坐标,然后取整可以获得想说坐标

但是需要采用浮点运算、除法运算、取整运算

中心画圆法

考虑中心在原点,半径为R的第二个8分圆

image-20220213200828262

  • 构造判别式(原方程)

image-20220213200758253

  • 如果d<0,则取P1为下一像素,而且下一像素的判别式为

image-20220213200847491

  • 如果d>0,则取P2为下一像素;而且下一像素的判别式为

image-20220213200916069

  • 第一像素是(0,R),判别式d的初始值为

image-20220213200935489

优化

用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(xpyp)+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);       // 画八分对称性的其他点
     }
}

例子

image-20220213201214140

其他算法

  • Bresenham画圆算法
  • 生成圆弧的正负法
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值