Você está na página 1de 11

ESTEC

Alexandre Massango
Dionildo Eliseu Machaia
Herminio josé Gomacha
Shelton José Macita

Tema: Formas de Rasterização de uma recta e da circunferência

Trabalho de Pesquisa a ser


apresentado na Cadeira de
Computação Gráfica (C.G) sob
Orientação da Msc. Arlete
Ferrao para efeitos de
Avaliação

Docente: Msc. Arlete Ferrao


Universidade Pedagógica

Maputo
Outubro , 2019
ESTEC

Alexandre Massango
Dionildo Eliseu Machaia
Herminio josé Gomacha
Shelton José Macita

Disciplina: computação gráfica

Tema: Formas de Rasterização de uma recta e da circunferência

Universidade pedagógica
Maputo
Outubro , 2019

Introdução
Neste presente trabalho faremos uma síntese daquilo que são os algoritmos de rasterização da
recta usando método de DDA, incremental e de Bressenham e algoritmos de rasterização da
circunferência, na qual falaremos dos métodos de ponto médio, Bressenham, polinomial , e por
fim o algoritmo trigonométrico.

Rasterização de circunferências
Emprega a propriedade de simetria que as circunferências apresentam. Apresenta uma
circunferência de raio R centrada na origem, verificamos que, uma vez calculado o pixel a do
segundo octante, os pixéis B a H dos outros octantes encontram-se imediatamente determinados
por simetria. Se (x, y) forem as coordenadas do pixel a, e como a circunferência se encontra
centrada na origem, as coordenadas dos pixéis a selecionar em todos os octantes.
Se o centro da circunferência se localizar num ponto (Xc, Yc) que não a origem, bastara calcular
os pixeis da circunferência como se ela centrada na origem e adicionar as suas coordenadas as
coordenadas do centro da circunferência. Para evitar a duplicação de pixeis que ocorrera quando
se representarem os pixeis dos extremos dos octantes, como o pixel (O, R), dever-se-a
seleccionar apenas quatro pixeis em vez de oito o que, para este caso, corresponde a seleccionar
os pixéis localizados em (O, R), (O, -R), (R, O) e (-R, O).
Uma circunferência é uma figura simétrica.
- Qualquer algoritmo por varrimento da circunferência pode tirar partido desta Simetria para
desenhar oito pontos a partir de cada valor que o algoritmo calcula:

Método Polinomial
- Uma circunferência pode ser definida pela seguinte equação polinomial:
y2 = r2 – x2 ,
onde r – raio da circunferência
- Então cada coordenada x, no sector que vai de 90º a 45º é determinada por Sucessivos
incrementos de x de 0 a r / 2 (x2 = r 2 − y 2 ⇒ 2x2 = r 2) e ca da coordenada y é calculada por
- Observação:
Este método tem operações aritméticas muito custosas para o computador é muito pouco
eficiente!!!
Organigrama:
1. Inicializar:
r - raio, (h, k) – centro da circunferência:
(x, y) = (0,0); i = incremento; x fim = r / sqrt(2);
2. Testar se a circunferência foi gerada totalmente:
se x > x fim, STOP
3. Calcular o valor de y:
y = sqrt (r2-x2)
4. Desenhar os pontos da simetria:
(x+h, y+k); (-x+h, -y+k);
(y+h, x+k); (-y+h, -x+k);
(-y+h, x+k); (y+h, -x+k);
(-x+h, y+k); (x+h, -y+k)
5. Incrementar x:
x = x+i
6. Continuar no passo 2.

Método Trigonométrico
Uma circunferência pode ser definido mediante a utilização de funções trigonométricas:
x = r*cos(θ); y = r*sen(θ)
onde:
θ – ângulo corrente
r – raio da circunferência
Com este método, θ é sucessivamente incrementado de 0 a π/4 e cada valor de x e y é calculado
Este método tem operações aritméticas ainda mais custosas que o método polinomial é muito
pouco eficiente!!!
1. Inicializar r - raio, (h, k) – centro da circunferência:
(x,y) = (0,0), i = incremento, θfim= (22/7)/4 (=π/4=45º); θ=0
2. Testar se a circunferência foi gerada totalmente:
se θ > θfim, STOP
3. Calcular os valores de x e y:
x = r*cos(θ); y = r*sen(θ)
4. Desenhar os pontos da simetria:
(x+h, y+k); (-x+h, -y+k);
(y+h, x+k); (-y+h, -x+k);
(-y+h, x+k); (y+h, -x+k);
(-x+h, y+k); (x+h, -y+k)
5. Incrementar θ:
θ=θ+i
6. Continuar no passo 2
Exemplo:
Ultima aula: (x,y) = (0,0), i = incremento, θfim= (22/7)/4 (=π/4=45º); θ=0

Algoritmo de Bresenham para a rasterização da circunferência


- Se é usada a simetria em relação a quatro eixos, apenas temos de gerar os pontos num sector
angular de 45º
- Se os pontos forem gerados de 90º a 45º, apenas serão feitos movimentos nas direcções de
+x e –y.
Ideia básica a melhor aproximação à circunferência verdadeira será definida por aqueles pixels
que estão a menor distância da circunferência verdadeira Note que se os pontos são gerados de
90º a 45º, podemos determinar cada novo tomando uma das seguintes ações:
- Mover uma unidade da direção +x
- Mover uma unidade na direção +x e uma na direção –y
- É preciso um método (eficiente) para decidir entre essas duas alternativas Relativamente ao
pixel P3, Relativamente ao ponto P.
1. D(Si ) = (xi−1 +1) + yi− − rP(xi-1,yi-1)
2. Por definição D(Si)>0 e D(Ti)≤0 Seja di = D(Si) + D(Ti)
Então:
A partir dessa equação e sabendo que (x0,y0) é (0,r) podemos obter que:
d1= 3 - 2*r
di então sabemos que:
se xi+1 = xi + 1; yi+1 = yi
P(xi-1,yi-1)
Utilizando a recorrência di podemos determinar que:
di+1 = di + 4xi + 6
Se di ≤ 0
então sabemos que:
xi+1 = xi + 1; yi+1 = yi -1
Utilizando a recorrência di podemos determinar que:
di+1 = di + 4(xi – yi)+ 10

Exemplo:
di+1 = di + 4xi + 6
Se di ≤ 0 di+1 = di + 4(xi – yi)+ 10

Rasterização da recta
Consiste em, num dispositivo de quadricular dados, os dois pixéis extremos de um segmento de
recta, determinado que pixéis localizados entre eles devem ser selecionados para compor
visualmente o segmento. Este problema tem solução trivial quando o segmento a traçar e
horizontal, vertical ou diagonal, se bem que, como ja referimos, a densidade visual de segmentos
diagonais não seja a mesma dos que são verticais ou horizontais. Fora destes casos, a
determinação dos pixéis que irão constituir um dado segmento de rectal coloca alguns
problemas.se apenas fossem selecionados os pixéis pertencentes ao segmento de recta, no caso
do segmento PV da figura so seriam selecionados os pixéis P, r, T e v, daqui resultando uma
linha de fraca densidade visual.
Este problema acentuar-se-ia no segmento AK, fazendo com que so fossem selecionados os
pixéis A, f e K, e, no limite, o segmento LO ficaria reduzido aos seus extremos. Por esta razão,
esta regra não pode constituir uma solução para o problema proposto.que a densidade visual do
segmento seja o mais uniforme possível, há então que selecionar o maior numero possível de
pixéis entre os dois pixéis dos extremos de um segmento de recta, selecionando os pixeis mais
próximos do segmento. para o caso do segmento Ak, isto corresponderia a ter como possíveis
candidatos os pixeis B, C, D, E, G, H, I e J. a seleção de todos estes pixeis produziria no entanto
uma linha cuja densidade variaria ao longo do segmento. iremos abordar os seguintes algoritmos:

Algoritmo Imediato
O algoritmo imediato para a rasterização de segmentos de recta parte da equação da recta que
suporta o segmento, cuja expressão e
y= mx +b
Para um segmento de recta cujos extremos cujas coordenadas são(x1, y1) e (x2, y2), e imediato
que os coeficientes m e b da equação (2 - 1) deverão ser

B = y1 – mx1

Fazendo então variar x entre x1 e x2 por incrementos de uma unidade, o valor de y calculando
será um valor real que deve ser arredondado para o inteiro mais próximo, o que pode ser
realizado através de uma das seguintes expressões equivalentes.

Algoritmo Digital diferencial analisado (DDA).

Funciona de forma de forma diferente e um algoritmo incremental aos valores seguintes e


calcular usamos os valores antecessores.
Este algoritmo utiliza o seguinte igualdade:
m*(x+1) + b = (m*x +b) + m = y + m
Então se 0 < m < 1
então podemos considerar que:
Então se 0 < m < 1
então podemos considerar que
∆x=1 e xk+1 = xk +1; yk+1 = yk + m (2)
Para segmentos com m > 1 devemos inverter os valores de x e y.
Neste caso podemos assumir que ∆y=1 e então da equação ∆x=∆y/m
obtemos que ∆x=1/m e finalmente podemos calcular
yk+1 = yk +1; xk+1= xk + 1/m (3)

xi + 1 = xi+1
xi + 1 = xi +1
Exemplo:
int x, y, x1, x2, y1, y2, i, xf, dx, dy;
float m,b;
dx = x2-x1;
dy = y2-y1;
y= mx+b;
m=y-b/x;
while(x<=x2)
{
if(dx<0)
{
if(dx<0)
{
x=x+1;
y=y+m;
else
x=x-1;
y=y-1;
else
if(dy>0)
y++;
x=x+1/m;
else
y--;
x=x-1/m;
}
}

Algoritmo incremental
Podemos melhorar o desempenho da rasterização de segmentos da recta se diminuirmos o
numero de operações matemáticas envolvidas. Para tal considerarmos o valor de y para dois
valores consecutivos de x que diferem entre si de uma unidade.

Algoritmo de Bresenham

os algoritmos anteriores apresentam vários inconvenientes, tanto quanto a precisão, como no


referente ao tipo de aritmética empregue, o que e muito importante para o desempenho da
rasterização. Com efeito, uma operação entre operadores inteiros e mais rápida do que
correspondente operação entre operandos em virgula flutuante. O algoritmo de Bresenham
realiza a rasterização de segmentos da recta empregado apenas operações de aritmética de
inteiros e portanto permite uma maior desempenho. O algoritmo basea se no critério do ponto
medio.
Para cada coluna d pixeis. Para coluna de pixeis existem dois pixeis que se encontram mais
próximo da recta um baixo e outo acima desta com a coluna de pixeis a cada um dos pixeis
encolhendo se entao o pixeis mais próximo da interação.no entanto esta denominação acarretaria
uma carga computacional elevada.

F(x, y) = ax+ by+c


+= xInc;
d += m;
if (d >= dx) {y += yInc; d -= c;};
}
}
else
{ c = 2 * dy; m = 2 * dx;
if (yInc < 0) dy++;
for (;;)
{ putPixel(g, x, y);
if (y == yQ) break;
y += yInc;
d += m;
if (d >= dy) {x += xInc; d -= c;};
}
}
}
Ex.: Queremos desenhar uma reta entre os pontos (x1,y1) e (x2, y2), com declive m entre 0
e 1 (i.e. reta dentro do 1o octante).

• Para as retas do 1o octante, dado um pixel sobre a reta, o próximo pixel é para direita (E) ou
para Direita acima (NE).
• Tendo o pixel (xi, yi) o próximo pixel é NE em (xi+1,yi+1) ou E em (xi+1, yi)?

• Vamos determinar um método para calcular de que lado da


reta está do ponto M. Para isso, considere sua função
implícita:

F(x,y) = ax + by + c = 0.

• Se dy = y2 - y1, e dx = x2 - x1;
• A equação da reta em termos de sua inclinação pode ser
escrita como:
• Na forma implícita: F(x,y) = dy.x – dx.y + dx.B=0. Onde a= dy, b = - dx e c = dx.B. Assim,
verifica-se que:
F(x,y) = 0, ponto sobre a linha
F(x,y) > 0, para pontos abaixo da linha
F(x,y) < 0, para pontos acima da linha
• Para simplificar a definição do próximo ponto em função da posição relativa da reta em relação
ao ponto médio, usa-se uma variável de decisão p.
– p=2dy – dx
• Se p < 0, o próximo ponto será (x+1, y) e recalcula p=p+2dy
• Se p >= 0, o próximo ponto será (x+1, y+1) e recalcula p= p+2dy – 2dx.
• O algoritmo é mostrado a seguir. Sua principal vantagem é usar somente variáveis
inteiras,dispensando operações de ponto flutuante.
• O cálculo de (xi+1, yi+1) é feito incrementalmente usando os cálculos feitos para (xi, yi).

Algoritmo de Bresenham
• Parâmetros de entrada: (x1,y1) e (x2,y2).
1. Calcula-se dx=x2-x1 e dy=y2-y1
2. Calculam-se as variáveis auxiliares: 2dy e 2dy-2dx.
3. Coloca-se nas variáveis de trabalho o ponto inicial:
x<- x1 e y<- y1.
4. Plota-se o ponto (x,y).
5. Calcula-se o parâmetro de decisão: p=2dy – dx.
6. Se p for negativo, então x <-x+1, p <- p+2dy e vai para o passo 8.
7. Se p for positivo ou zero, então: x <- x+1, y <- y+1 e p <- p+2dy – 2dx.
8. Repetem-se os passos 6 a 7 até que o ponto (x2,y2) seja alcançado.

Você também pode gostar