设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2558|回复: 8
打印 上一主题 下一主题

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

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1939
在线时间
403 小时
注册时间
2015-8-30
帖子
395
跳转到指定楼层
1
发表于 2017-1-26 17:33:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
求一个画圆的方法。
  1. class Bitmap
  2.   def draw_circle(ox, oy, radius, color)
  3.     ...
  4.   end
  5. end
复制代码
最好是这样子的。其中ox和oy是圆心坐标,radius是半径,color是颜色,执行这个方法之后会在执行者(某Bitmap对象)上出现一个实心的圆。
非常感谢。
小仙女一枚~

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

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

RUBY 代码复制
  1. class Bitmap
  2.  
  3.                 def draw_ring(x,y,diameter,thickness,color)
  4.                         outer_radius = diameter / 2
  5.                         inner_radius = outer_radius - thickness + 1
  6.                         draw_circle_w_thickness(x,y,inner_radius,outer_radius,color)
  7.                 end
  8.  
  9.                 def xLine(x1,x2,y,color)
  10.       while x1 <= x2
  11.                          self.set_pixel(x1,y,color)
  12.                          x1 += 1
  13.                         end
  14.     end
  15.  
  16.                 def yLine(x,y1,y2,color)
  17.       while y1 <= y2
  18.                          self.set_pixel(x,y1,color)
  19.                          y1 += 1
  20.                         end
  21.     end
  22.  
  23.                 def draw_circle_w_thickness(xc,yc,inner,outer,color)
  24.  
  25.                         xo = outer
  26.                         xi = inner
  27.                         y = 0
  28.                         erro = 1 - xo
  29.                         erri = 1 - xi
  30.  
  31.                         while(xo >= y)
  32.               xLine(xc + xi, xc + xo, yc + y,  color)
  33.         yLine(xc + y,  yc + xi, yc + xo, color)
  34.         xLine(xc - xo, xc - xi, yc + y,  color)
  35.         yLine(xc - y,  yc + xi, yc + xo, color)
  36.         xLine(xc - xo, xc - xi, yc - y,  color)
  37.         yLine(xc - y,  yc - xo, yc - xi, color)
  38.         xLine(xc + xi, xc + xo, yc - y,  color)
  39.         yLine(xc + y,  yc - xo, yc - xi, color)               
  40.  
  41.                           y += 1
  42.  
  43.                                 if erro < 0
  44.             erro += 2 * y + 1
  45.         else
  46.             xo -= 1
  47.             erro += 2 * (y - xo + 1)
  48.         end
  49.  
  50.                                 if y > inner
  51.             xi = y
  52.         else
  53.             if erri < 0
  54.                 erri += 2 * y + 1
  55.             else
  56.                 xi -= 1
  57.                 erri += 2 * (y - xi + 1)
  58.             end
  59.         end
  60.  
  61.                         end               
  62.                 end
  63.  
  64. end

点评

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

使用道具 举报

Lv3.寻梦者

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

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

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

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9727
在线时间
3227 小时
注册时间
2011-3-24
帖子
739

开拓者

4
发表于 2017-1-26 22:28:31 | 只看该作者
本帖最后由 Mr.Jin 于 2017-1-26 22:33 编辑

RUBY 代码复制
  1. class Bitmap
  2.   def fill_circle(ox, oy, r, color)
  3.     imax = (r * 707) / 1000 + 1
  4.     sqmax = r * r + r / 2
  5.     x = r
  6.     fill_rect ox - r, oy, 2 * r, 1, color
  7.     for i in 1..imax
  8.       if (i * i + x * x) > sqmax
  9.         if x > imax
  10.           fill_rect ox - i + 1, oy + x, 2 * (i - 1), 1, color
  11.           fill_rect ox - i + 1, oy - x, 2 * (i - 1), 1, color
  12.         end
  13.         x -= 1
  14.       end
  15.       fill_rect ox - x, oy + i, 2 * x, 1, color
  16.       fill_rect ox - x, oy - i, 2 * x, 1, color
  17.     end
  18.   end
  19. end


或者,短的:
RUBY 代码复制
  1. class Bitmap
  2.   def fill_circle(x, y, radius, color = Color.new(255, 255, 255, 255))
  3.     for i in (x - radius)..(x + radius)
  4.       sa = (x - i).abs
  5.       x_ = i < x ? x - sa : i == x ? x : x + sa
  6.       y_ = Integer((radius ** 2 - sa ** 2) ** 0.5)
  7.       self.fill_rect(x_, y - y_, 1, y_ * 2, color)
  8.     end
  9.   end
  10. end

点评

它是根号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的口袋心脏病!<<<<<
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 05:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表