查看: 2896|回复: 8

[已经解决] 求一个画圆的方法

[复制链接]
梦石
0
星屑
1944
在线时间
404 小时
注册时间
2015-8-30
回帖
322
发表于 2017-1-26 17:33:58 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
求一个画圆的方法。
  1. class Bitmap
  2.   def draw_circle(ox, oy, radius, color)
  3.     ...
  4.   end
  5. end
复制代码
最好是这样子的。其中ox和oy是圆心坐标,radius是半径,color是颜色,执行这个方法之后会在执行者(某Bitmap对象)上出现一个实心的圆。
非常感谢。
小仙女一枚~
梦石
0
星屑
6891
在线时间
7027 小时
注册时间
2013-11-2
回帖
1263

开拓者剧作品鉴家

发表于 2017-1-26 18:39:35 | 显示全部楼层
正好我有一个(原本是C++码,我改成Ruby了)画圆环的码(空心)。要弄成实心的话,大概要调整一下吧。

[pre lang="ruby"]
class Bitmap

                def draw_ring(x,y,diameter,thickness,color)
                        outer_radius = diameter / 2
                        inner_radius = outer_radius - thickness + 1
                        draw_circle_w_thickness(x,y,inner_radius,outer_radius,color)
                end
       
                def xLine(x1,x2,y,color)
      while x1 <= x2
                         self.set_pixel(x1,y,color)
                         x1 += 1
                        end
    end
               
                def yLine(x,y1,y2,color)
      while y1 <= y2
                         self.set_pixel(x,y1,color)
                         y1 += 1
                        end
    end

                def draw_circle_w_thickness(xc,yc,inner,outer,color)
               
                        xo = outer
                        xi = inner
                        y = 0
                        erro = 1 - xo
                        erri = 1 - xi

                        while(xo >= y)
              xLine(xc + xi, xc + xo, yc + y,  color)
        yLine(xc + y,  yc + xi, yc + xo, color)
        xLine(xc - xo, xc - xi, yc + y,  color)
        yLine(xc - y,  yc + xi, yc + xo, color)
        xLine(xc - xo, xc - xi, yc - y,  color)
        yLine(xc - y,  yc - xo, yc - xi, color)
        xLine(xc + xi, xc + xo, yc - y,  color)
        yLine(xc + y,  yc - xo, yc - xi, color)               
                       
                          y += 1
                               
                                if erro < 0
            erro += 2 * y + 1
        else
            xo -= 1
            erro += 2 * (y - xo + 1)
        end
                               
                                if y > inner
            xi = y
        else
            if erri < 0
                erri += 2 * y + 1
            else
                xi -= 1
                erri += 2 * (y - xi + 1)
            end
        end
                               
                        end               
                end
               
end
[/pre]

点评

测试过了,有效,但是如果刚刚好和diameter/2相等的话圆心处的像素是不会上色的,所以thickness可以调整为diameter/2+1的值  发表于 2017-1-27 14:19
测试不就知道了  发表于 2017-1-27 11:53
没有测试这个脚本,不过如果diameter/2和thickness相等的话是不是就是一个实心圆了?  发表于 2017-1-27 10:17
回复

使用道具 举报

梦石
0
星屑
1902
在线时间
959 小时
注册时间
2012-7-5
回帖
225
发表于 2017-1-26 18:59:42 | 显示全部楼层
提供些易于理解的思路:
一般:
椭圆方程 (纯属搞笑,计算量巨大效率低下,且画出来往往效果欠佳)
三角函数画圆法:按极坐标直接画就行了,效果还可以
神奇的方法:
使用正多边形(例如30边形或更不可思议)逼近,效率非常好!而且可以先把顶点的坐标预先算出来,打个表。需要画出来的时候根据需要,缩放平移即可。

要实心的?:
拿线段填;
显卡画实心三角形效率是非常高的(这就意味着能很高效地拼出来实心正多边形,用正多边形逼近圆,例子见:https://github.com/sxysxy/XYGui/ ... window_with_gls.rbw 第76~79行

喵 或许楼主只是想要个脚本而已。。。。(撤
tan(pi/2)
回复

使用道具 举报

梦石
0
星屑
9687
在线时间
3224 小时
注册时间
2011-3-24
回帖
616

开拓者

发表于 2017-1-26 22:28:31 | 显示全部楼层
本帖最后由 Mr.Jin 于 2017-1-26 22:33 编辑

[pre lang="ruby"]class Bitmap
  def fill_circle(ox, oy, r, color)
    imax = (r * 707) / 1000 + 1
    sqmax = r * r + r / 2
    x = r
    fill_rect ox - r, oy, 2 * r, 1, color
    for i in 1..imax
      if (i * i + x * x) > sqmax
        if x > imax
          fill_rect ox - i + 1, oy + x, 2 * (i - 1), 1, color
          fill_rect ox - i + 1, oy - x, 2 * (i - 1), 1, color
        end
        x -= 1
      end
      fill_rect ox - x, oy + i, 2 * x, 1, color
      fill_rect ox - x, oy - i, 2 * x, 1, color
    end
  end
end[/pre]

或者,短的:
[pre lang="ruby"]class Bitmap
  def fill_circle(x, y, radius, color = Color.new(255, 255, 255, 255))
    for i in (x - radius)..(x + radius)
      sa = (x - i).abs
      x_ = i < x ? x - sa : i == x ? x : x + sa
      y_ = Integer((radius ** 2 - sa ** 2) ** 0.5)
      self.fill_rect(x_, y - y_, 1, y_ * 2, color)
    end
  end
end[/pre]

点评

它是根号2除以2 ,根号2约等于1.414,除以二约等于0.707  发表于 2017-1-27 14:42
谢谢,,短的那个画出来是半圆,,顺便请问一下长的那个第3行的707这个常量是怎么得出的?  发表于 2017-1-27 14:17

评分

参与人数 1梦石 +1 收起 理由
RaidenInfinity + 1 认可答案

查看全部评分

>>→Lanza Games 2020←<<
Lanza Schneider
浪子心,孤星梦永远流浪……
~不会放弃,我的精力永远充沛~
>>>>>Lanza Adventure<<<<<
>>>>>Lanza的新年派对!<<<<<
>>>>>Lanza的口袋心脏病!<<<<<
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部