计算机图形学之画圆(中点画圆法、Bresenham画圆法)

参考学习了一些前辈的代码,总结了以下这个,感谢前人栽树,同时欢迎交流。

整个画圆利用了圆的八对称性,故只需画出八分之一圆就可利用对称性就可以画出整个圆。

  •   专门写了一个函数来画圆的点,其中(x0,y0)为圆心坐标,根据(x,y)来画出八对称点,DrawPixel()为绘制点的函数。
 function DrawCirclePoint(x0, y0, x, y, color) {
     DrawPixel(x0 + x, y0 + y, color); 
     DrawPixel(x0 + y, y0 + x, color);
     DrawPixel(x0 - x, y0 + y, color);
     DrawPixel(x0 - y, y0 + x, color);
     DrawPixel(x0 + x, y0 - y, color);
     DrawPixel(x0 + y, y0 - x, color);
     DrawPixel(x0 - x, y0 - y, color); 
     DrawPixel(x0 - y, y0 - x, color);
 }
  • 中点画圆法:
function MiddlePiontCircle(x0, y0, r, color) {
     var x = 0, y = r;
     var d = 1 - r;//使用e=d-0.25代替d
     sleep(1000);
     DrawCirclePoint(x0, y0, x, y, color);
     while (x <= y) {
         if (d < 0)
              d += 2 * x + 3;
         else {
              d += 2 * (x - y) + 5;
              y--;
          }
         x++;
         DrawCirclePoint(x0, y0, x, y, color);
      }
 }
  • Bresenham画圆算法
function BresenhamCircle(x0, y0, r, color) {
    var x = 0, y = r;
    var delta = 2 * (1 - r);
    var delta1, delta2, direction;
    while (y >= 0) {
        // sleep(1000);
        DrawCirclePoint(x0, y0, x, y, color);
        if (delta < 0) {
             delta1 = 2 * (delta + y) - 1;
             if (delta1 <= 0) direction = 1;
             else direction = 2;
         }
         else if (delta > 0) {
              delta2 = 2 * (delta - x) - 1;
              if (delta2 <= 0) direction = 2
              else direction = 3;
         }
        else
              direction = 2;
        switch (direction) {
              case 1: 
                  x++;
                  delta += 2 * x + 1;
                  break;
              case 2: 
                  x++;
                  y--;
                  delta += 2 * (x - y + 1);
                  break;
              case 3: 
                  y--;
                  delta += (-2 * y + 1);
                  break;
         }
     }
 }

 

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值