【计算机图形学】2-3 椭圆的绘制

本文深入探讨了椭圆绘制方法,特别是使用Bresenham算法进行高效绘制的技术细节。通过实现核心代码,理解了如何将椭圆的理论转化为实际的计算机图形输出。

3. 椭圆

  椭圆绘制方法与圆类似,椭圆我们记录矩形对角线端点坐标,使用Bresenham方法绘制。

基本代码:

void draw_ellipse_Bresenham_4i(int32 x0, int32 y0, int32 x1, int32 y1)
{
  int32 i, j;
  int32 x = (x0 + x1) >> 1;
  int32 y = (y0 + y1) >> 1;
  int32 a = abs(x0 - x1) >> 1;
  int32 b = abs(y0 - y1) >> 1;
  int64 e, aa, bb;
  aa = a * a;
  bb = b * b;
  j = b;
  e = (bb << 2) + aa * (1 - (b << 2));
  for(i=0;i<=a;++i)
  {
    draw_point_2i(x + i, y + j);
    draw_point_2i(x + i, y - j);
    draw_point_2i(x - i, y + j);
    draw_point_2i(x - i, y - j);
    if(e <= 0)
    {
      e += bb * (12 + (i<<3));
    }
    else
    {
      e += bb * (12 + (i<<3)) + aa * (8 - (j<<3));
      -- j;
    }
    if(bb * ((i<<1) + 2) > aa * ((j<<1) - 1))
    {
      break;
    }
  }
  e = bb * ((i<<1) + 1) * ((i<<1) + 1) + aa * ((j<<1) - 2) * ((j<<1) - 2) - ((aa * bb)<<2);
  for(;j>=0;--j)
  {
    draw_point_2i(x + i, y + j);
    draw_point_2i(x + i, y - j);
    draw_point_2i(x - i, y + j);
    draw_point_2i(x - i, y - j);
    if(e <= 0)
    {
      e += bb * (8 + (i<<3)) + aa * (12 - (j<<3));
      ++ i;
    }
    else
    {
      e += aa * (12 - (j<<3));
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值