Project1
标题: 求一个画圆的方法 [打印本页]
作者: 有丘直方 时间: 2017-1-26 17:33
标题: 求一个画圆的方法
求一个画圆的方法。- class Bitmap
- def draw_circle(ox, oy, radius, color)
- ...
- end
- end
复制代码 最好是这样子的。其中ox和oy是圆心坐标,radius是半径,color是颜色,执行这个方法之后会在执行者(某Bitmap对象)上出现一个实心的圆。
非常感谢。
作者: RaidenInfinity 时间: 2017-1-26 18:39
正好我有一个(原本是C++码,我改成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
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
作者: 浮云半仙 时间: 2017-1-26 18:59
提供些易于理解的思路:
一般:
椭圆方程 (纯属搞笑,计算量巨大效率低下,且画出来往往效果欠佳)
三角函数画圆法:按极坐标直接画就行了,效果还可以
神奇的方法:
使用正多边形(例如30边形或更不可思议)逼近,效率非常好!而且可以先把顶点的坐标预先算出来,打个表。需要画出来的时候根据需要,缩放平移即可。
要实心的?:
拿线段填;
显卡画实心三角形效率是非常高的(这就意味着能很高效地拼出来实心正多边形,用正多边形逼近圆,例子见:https://github.com/sxysxy/XYGui/ ... window_with_gls.rbw 第76~79行
喵 或许楼主只是想要个脚本而已。。。。(撤
作者: Mr.Jin 时间: 2017-1-26 22:28
本帖最后由 Mr.Jin 于 2017-1-26 22:33 编辑
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
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
或者,短的:
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
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
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |