11 de dez. de 2009

Desenhando Círculos em NCL/Lua

Implementei uma função que permite desenhar circulos com o Canvas para NCL/Lua

Função

function desenharCirculo ( X0 , Y0 , raio , mode )

function converterGrau2Rad ( x )
return ( x / 180 ) * math.pi
end

local tblPt = {}

if mode ~= 'fill' then
mode = 'frame'
end

for i=0, 360 do
local x = (raio * math.cos(converterGrau2Rad(i)))
local y = (raio * math.sin(converterGrau2Rad(i)))

if mode == 'frame' then
tblPt[i] = {}
table.insert(tblPt[i],X0 - x)
table.insert(tblPt[i],Y0 - y)
end

if mode == 'fill' then
canvas:drawLine (X0, Y0, X0 - x, Y0 - y)
end

end

if mode == 'frame' then

for i=0, table.maxn(tblPt) do

if i == table.maxn(tblPt) then
canvas:drawLine (tblPt[i][1], tblPt[i][2], tblPt[0][1], tblPt[0][2])
else
canvas:drawLine (tblPt[i][1], tblPt[i][2], tblPt[i+1][1], tblPt[i+1][2])
end

end

end


end



A chamada para a função é a seguinte:

canvas:attrColor(96, 181, 255, 255)
desenharCirculo ( 250 , 250 , 20 , 'frame' )
canvas:flush()

Parâmetros
A função trabalha com quatro parâmetros, são eles:
X0: A coordenada X do ponto central.
Y0: A coodenada Y do ponto central.
Raio: O tamanho do raio do círculo.
Mode: É o tipo de desenho que será feito. Se escolhido frame, será desenhado apenas a moldura. Se for escolhido fill o desenho será preenchido. O modo frame é utilizado como default.

Problemas
Nem tudo na vida é perfeito e esta função não seria diferente. Quando desenhamos um círculo com mode fill e raio muito grande, vemos algumas falhas. Se alguém conseguir solucionar o problema, escreva nos comentários que a função será atualizada e dado os devidos créditos. :)

2 comentários:

Rattones disse...

o problema com certeza está aki "for i=0, 360 do" com passo 1 vc vai pegar so as posições de grau exato, e qdo vc aumenta muito o pixel do grau exato não vai cobrir todo espaço necessário, então ou vc diminui o passo para 0,1 para pegar mais posições ou limita um raio maximo ..

Luiz disse...

Marcelo você está completamente certo.

A partir do momento que eu vario o passo do for, aumento a precisão.

Quando maior a precisão, melhor o resultado final, maior o processamento.

Eu inclui uma atualização desta função no meu site pessoal: http://luizeduardoaraujo.info/?p=277

[[]]'s