ALGORITMOS PARA DESENHAR RETAS E CÍRCULOS
Download
Report
Transcript ALGORITMOS PARA DESENHAR RETAS E CÍRCULOS
ALGORITMOS PARA DESENHAR RETAS E C´IRCULOS
Jann Claude Mousquer1 , Kenner Alan Kliemann1 , Miguel Diogenes Matrakas1
1
ˆ
˜ – Faculdades Anglo-Americano (FAA)
Curso de Ciencia
da Computac¸ao
Foz do Iguac¸u, PR - Brasil
{jannclaude,kenner.hp}@gmail.com, [email protected]
Abstract. This article is a bibliography review about algorithms to draw
lines and circles using graphic primatives. The algorithms currently used,
are based on cartesian plane and are defined in the SRPG (Simple Raster Graphics Package). Will be discussed some of the algorithms that
rasterize graphic objects.
˜ bibliografica
´
Resumo. Este artigo e´ uma revisao
sobre algor´ıtmos para
´
desenhar retas e circulos utilizando primitivas graficas.
Os algor´ıtmos
˜ definidos
atualmente utilizados se baseiam no plano cartesiano, e sao
no SRGP (Simple Raster Graphics Package). Sera´ abordado alguns dos
˜ de objetos graficos.
´
algor´ıtmos que fazem a rasterizac¸ao
´
Palavras Chave: Primitivas Graficas,
Retas, C´ırculos;
˜
1. Introduc¸ao
´ chamado de primitivas graficas
´
˜
E
os comandos e func¸oes
que manipulam e al´
´ entram na definic¸ao
˜ os
teram os elementos graficos
de uma imagem. Tambem
´
´
˜ constru´ıdos outros, mais
elementos basicos
de graficos
a partir dos quais sao
complexos.(Hetem Annibal Jr.,2006).
˜ sera´ abordardado o estudo das primitivas
Com base nesta afirmac¸ao,
´
´
graficas
responsaveis
pelo desenho de retas e c´ırculos. Computacionalmente,
˜ representados por um conjunto de pontos. O ponto e´ a unitodos os objetos sao
´
´ pode ser chamada de pixel. As propriedades
dade grafica
fundamental e tambem
´
˜ posic¸ao
˜ no plano grafico
´
basicas
de um pixel sao:
(x,y) e cor.
´
Para se obter um pixel e´ necessario
informar o par ordenado (x,y), que
possibilita as coordenadas de linha e coluna onde sera´ pintada a grade do v´ıdeo;
˜ especificada no sistema operacional. Com isso, pode acordo com a resoluc¸ao
demos unir pontos a fim de construir objetos mais complexos.
´
Para se desenhar uma reta ou qualquer outro objeto, e´ necessario
fazer
˜
˜ e´ o processo que e´ utilizado para determinar
uma rasterizac¸ao.
Rasterizac¸ao
˜ os pixels que melhor aproximam uma linha desejavel
´
quais sao
na tela, isso se
´
˜ conseguem representar uma reta
da´ ao fato de que dispositivos graficos
nao
˜
perfeita, como apresentado na Figura 1, apenas uma aproximac¸ao.
´
O Simple Raster Graphics Package (SRGP) e´ um pacote grafico,
indepen˜ dos dispositivos
dente de dispositivo, que explora as habilidades de rasterizac¸ao
´
´
˜
graficos.
Ele implementa primitivas graficas,
fornecendo suporte a` aplicac¸oes.
˜
Figura 1. Rasterizac¸ao.
O SRGP trata a tela de sa´ıda como um plano cartesiano, considerando o ponto
de origem (0,0), o canto inferior esquerdo. Partindo deste princ´ıpio, as entradas
˜ tratadas como coordenadas no plano, tendo como unidade o
(x1,y1,x2,y2), sao
pixel.
2. Retas
O SRGP fornece procedimentos para desenhos de retas, o procedimento para o
´
desenho de uma reta e:
1
procedure SRGP_lineCoord (0,0,100,300);
Neste exemplo uma linha do ponto (0,0) ao ponto (100,300) sera´ dese˜ sera´
nhado na tela. Para que a reta seja representada em tela, a rasterizac¸ao
efetuada pelo SRGP uma vez que o procedimento anterior seja invocado. Sera´
˜ a` seguir.
abordardado alguns dos algoritmos de rasterizac¸ao
2.1. Algor´ıtmo Iterativo Basico
˜ de linhas e´ determinar a qual valor inteiro
A ideia mais simples para rasterizac¸ao
no eixo y, uma reta se aproxima. De modo geral, para cada valor x, calcula-se o
arredondamento de y. Logo, temos que:
Para i pontos em X = (Xi, Round(Yi));
˜ com esse alNa Figura 2 podemos observar o resultado da rasterizac¸ao
goritmo e notamos ainda que, para retas verticais o algoritmo apresenta uma
˜ haver um calculo
´
grande falha, isso se da´ ao fato de nao
dos pontos aproxima˜ e´ implementado
dos no eixo x. Esta falha e´ o principal motivo pelo qual nao
´
atualmente esse algoritmo, uma vez que se torna pouco versatil.
2.2. Bresenham
´ conhecido como algor´ıtmo do ponto medio,
´
Tambem
baseia-se no argumento
de que um segmento de reta, ao ser plotado, deve ser cont´ınuo, os pixels que
˜
compoem
o segmento devem ser vizinhos; Isso fara´ com que os pontos das retas
˜ do Algor´ıtmo Iterativo Basico.
´
Figura 2. Demonstrac¸ao
´
˜ havendo separac¸ao
˜ entre os pixels pintados, evitando o erro
sejam proximos
nao
produzido pelo algor´ıtmo demonstrado anteriormente.
Um outro atrativo e´ que o algor´ıtmo de Bresenham utiliza-se apena de
´
´
˜ de arredondamento
aritmetica
inteira para calculo
dos pontos, evitando a func¸ao
(Round), fornecendo uma economia de processamento. O procedimento em
´
´
˜ do algor´ıtmo.
pseudo-codigo
abaixo, apresenta a logica
da implementac¸ao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure midpointLine (x0, y0, x1, y1, value : Integer);
var
dx, dy, incrE, incrNE, d, x, y : Integer;
begin
dx
:= x1 - x0;
dy
:= y1 - y0;
d
:= 2*dy - dx;
incrE := 2*dy;
incrNE:= 2*(dy - dx);
x
:= x0;
y
:= y0;
writePixel(x, y, value);
while x < x1 DO
IF d <= 0 THEN
d:= d + incrE;
x:= x + 1;
else
17
d:= d + incrNE;
x:= x + 1;
y:= y + 1;
18
19
20
end;
writePixel(x, y, value);
21
22
23
24
end;
end midpointLine;
˜ de retas desenhadas pelo Algoritmo
Na Figura 3 temos a demonstrac¸ao
de Bresenham.
Figura 3. Exemplo de retas desenhadas com Bresenham.
3. C´ırculos
Para trac¸ar c´ırculos, o SRGP trata-os como um caso particular devido a sua
˜ o c´ırculo deve ser transladado de
simetria. Desta forma, para a rasterizac¸ao
´ calculado entao
˜ os pontos
forma que o c´ırculo esteja centrado na origem (0,0). E
˜ entao
˜ escritos por simetria. Para calcular
do primeiro quadrante e os demais sao
os valores em y, e´ considerado que:
y 2 = R 2 − x2
(1)
´
No entanto, um calculo
neste formato para cada ponto e´ computacional´
´
ˆ
mente inviavel,
visto que haveria um alto numero
de calculos
de potencia
e raiz,
´
´
que exigem consideravel processamento.
3.1. Simetria de Ordem 8
Segundo [Foley et al. 1995], o Algoritmo de Simetria de Ordem 8 considera que,
ˆ
o trac¸ado de uma circunferencia
pode tirar proveito de sua simetria. Considere
ˆ
uma circunferencia
centrada na origem. Se o ponto ( x, y ) pertence a` circunˆ
ˆ
ferencia,
pode-se calcular de maneira trivial sete outros pontos da circunferencia
ˆ
Figura 4. Consequentemente, basta computar um arco de circunferencia
de 45o
ˆ
ˆ
para obter a circunferencia
toda. Para uma circunferencia
com centro na origem,
´
os oito pontos simetricos
podem ser trac¸ados usando o procedimento Circle˜ calcula os valores de entrada x e y, mas uma vez
Points. Este algor´ıtmo nao
calculados nos da´ outros sete pontos do c´ırculo.
Figura 4. Simetria de Ordem 8.
1
2
3
4
5
6
7
8
9
10
void CirclePoints(int x, int y, int color){
write_pixel( x, y, color);
write_pixel( x, -y, color);
write_pixel(-x, y, color);
write_pixel(-x, -y, color);
write_pixel( y, x, color);
write_pixel( y, -x, color);
write_pixel(-y, x, color);
write_pixel(-y, -x, color);
}/* end CirclePoints */
´
E´ recomendavel
que x seja diferente de y, pois seria calculado 4 valores
repetidos, subutilizando assim o algoritmo.
´
3.2. Algoritmo do Ponto Medio
´
Bresenham desenvolveu em 1965 um algoritmo classico
que usa apenas
´
´
variaveis
inteiras e que permite que o calculo
de (xi + 1, yi + 1) seja feito in´
˜ do alcrementalmente, usando os calculos
ja´ feitos para (xi , yi), uma variac¸ao
˜
gor´ıtmo de mesmo nome, para retas. Este algoritmo assume que a inclinac¸ao
˜ podem ser tratadas por simetria). O
da linha esta´ entre 0 e 1 (outras inclinac¸oes
ponto (x1, y1) e´ o inferior esquerdo, e (x2, y2) e´ o superior direito.
Considere a curva na Figura 5. Assumindo que o pixel que acabou de
´
ser selecionado e´ P, em (xp, yp), e o proximo
deve ser escolhido entre o pixel a`
´ entre
direita (pixel E) e o pixel abaixo a` direita (SE). Seja M o ponto intermediario
os pixels E e SE. O que se faz e´ observar de que lado da reta esta´ o ponto M.
´ verificar que se M esta´ abaixo da curva, o pixel E esta´ mais proximo
´
E facil
´
da reta; se M esta´ acima, SE esta´ mais proximo
da curva. A seguir e´ apresentado
o algoritmo simples para conversao matricial de retas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void MidpointCircle(int radius, int value)
{
int x = 0;
int y = radius;
int d = 1 - radius;
CirclePoints(x, y, value);
while(y > x) {
if (d < 0)
d += 2 * x + 3;
else {
d += 2 * (x - y) + 5;
y--;
}
x++;
CirclePoints(x, y, value);
}
}
´
Figura 5. Algoritimo do Ponto Medio
M e as escolhas E e SE.
Como demonstrado por [Traina and de Oliveira 2006], o teste do ponto´
´
´ disso, o erro
medio
permite a escolha do pixel mais proximo
da curva. Alem
ˆ
(a distancia
vertical entre o pixel escolhido e a linha) e´ sempre inferior a 0.5.
´
´
´
˜
A aritmetica
necessaria
para calcular o proximo
ponto a cada passo e´ adic¸ao
˜ e´ necessaria.
´
´ o calculo
´
simples, nenhuma multiplicac¸ao
Apos
dos pontos no
primeiro quadrante, de 0o a` 45o , utiliza-se o algoritmo de simetria de ordem 8
para calcular os restantes, acelerando o processo.
˜
4. Conclusao
˜ visual que hoje ocorre entre usuario
´
´
A interac¸ao
e maquina
pelos dispositivos
´
˜ e abstrac¸ao
˜ dos dados
graficos,
so´ e´ poss´ıvel devido ao estudo da rasterizac¸ao
˜ nos auxiliam a fazer a
reais para o meio digital. Os algoritmos de rasterizac¸ao
˜ dos elementos graficos
´
´
˜ de
abstrac¸ao
mais basicos,
possibilitando a construc¸ao
˜ de
infinitos objetos. Para que fosse poss´ıvel a velocidade e qualidade de exibic¸ao
´
˜ somente o hardware precisou evoluir,
objetos graficos
que possu´ımos hoje, nao
´
mas algoritmos eficientes e eficazes foram necessarios.
ˆ
Referencias
Foley, J. D., van Dam, A., Feiner, S. K., and Hughes, J. F. (1995). Computer
graphics: Principles and practice.
˜
Traina, A. J. M. and de Oliveira, M. C. F. (2006). Apostila de computac¸ao
´
grafica.
Dispon´ıvel em: http://www.inf.ufes.br/˜thomas/graphics/
www/apostilas/GBdI2006.pdf. Acesso em Maio/2014.