Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Computação Gráfica Parte2, Notas de estudo de Aplicações de Ciências da Computação

Apostilas de Computação sobre a Computação Gráfica, Traçadores Digitais, Dispositivos de Video Vetoriais (Vector Refresh Display Tubes), Primitivas de Software para Dispositivos Vetoriais, Dispositivos Gráficos Matriciais.

Tipologia: Notas de estudo

2013

Compartilhado em 11/12/2013

Futebol13
Futebol13 🇧🇷

4.5

(204)

196 documentos

1 / 39

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
pixels, como ilustrado na Figura 3.15. Conseq¨uentemente, o melhor procedimento ao ´e atribuir o valor
correspondente a preto a um ´unico pixel em uma coluna, mas atribuir diferentes intensidades da cor a cada
pixel interceptado pela ´area coberta pelo retˆangulo que aproxima a linha, na coluna em quest˜ao. Assim,
linhas horizontais ou verticais, cuja espessura ´e 1 pixel, afetam exatamente 1 pixel em uma coluna ou
linha. Para linhas com outras inclina¸oes, mais do que 1 pixel ´e tra¸cado, cada qual com uma intensidade
apropriada.
Figura 3.15: Segmento de reta definido com uma espessura diferente de zero.
Mas, qual ´e a geometria de um pixel? Qual o seu tamanho? Qual intensidade a atribuir a um
pixel interceptado pela linha? ´
E computacionalmente simples assumir que os pixels definem uma malha
regular de “quadrados” ao sobrepostos que recobre a tela, sendo que as intersec¸oes da malha definem
o posicionamento dos pixels, i.e., pixels ao tratados como “quadrados” com centro nas interse¸oes da
malha. Uma primitiva pode sobrepor toda ou parte da ´area ocupada por um pixel. Assumimos tamb´em
que a linha contribui para a intensidade do pixel segundo um valor proporcional `a porcentagem da ´area do
pixel coberta por ela. Se a primitiva cobre toda a ´area do pixel, ele recebe a intensidade axima (preto,
no caso), se cobre parte o pixel recebe um tom de cinza cuja intensidade ´e proporcional `a ´area coberta
(Figura 3.16). O efeito ´e “suavizar” a defini¸ao da reta ou das arestas que definem a primitiva, melhorando
sua aparˆencia visual quando observada `a distˆancia. Essa estrat´egia ´e denominada amostragem por ´area
ao ponderada (unweighted area sampling). Uma estrat´egia ainda mais eficiente ´e a amostragem por ´area
ponderada (weighted area sampling).
Figura 3.16: A intensidade do pixel ´e proporcional `a area coberta.
Amostragem de ´
Areas Ponderada
Nessa outra estrat´egia, assim como na anterior, valem duas propriedades: 1) a intensidade atribu´ıda ao
pixel ´e diretamente proporcional `a ´area do mesmo coberta pela primitiva; 2) se a primitiva ao intercepta
a ´area do pixel, ent˜ao ela ao contribui nada para a cor do mesmo. A diferen¸ca ´e que, na estrat´egia
ponderada, ao determinar a contribui¸ao de uma ´area considera-se, tamb´em, a sua proximidade em rela¸ao
ao centro do pixel. Assim, ´areas iguais podem contribuir de forma desigual: uma ´area pequena pr´oxima
do centro do pixel tem maior influˆencia do que uma ´area grande a uma distˆancia maior. Entretanto,
para garantir que a primitiva contribui para um pixel apenas se ela sobrep˜oe a ´area ocupada pelo mesmo,
precisamos mudar a geometria do pixel da seguinte forma: vamos considerar que o pixel ocupa uma ´area
39
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27

Pré-visualização parcial do texto

Baixe Computação Gráfica Parte2 e outras Notas de estudo em PDF para Aplicações de Ciências da Computação, somente na Docsity!

pixels, como ilustrado na Figura 3.15. Conseq¨uentemente, o melhor procedimento n˜ao ´e atribuir o valor correspondente a preto a um ´unico pixel em uma coluna, mas atribuir diferentes intensidades da cor a cada pixel interceptado pela ´area coberta pelo retˆangulo que aproxima a linha, na coluna em quest˜ao. Assim, linhas horizontais ou verticais, cuja espessura ´e 1 pixel, afetam exatamente 1 pixel em uma coluna ou linha. Para linhas com outras inclina¸c˜oes, mais do que 1 pixel ´e tra¸cado, cada qual com uma intensidade apropriada.

Figura 3.15: Segmento de reta definido com uma espessura diferente de zero.

Mas, qual ´e a geometria de um pixel? Qual o seu tamanho? Qual intensidade a atribuir a um pixel interceptado pela linha? E computacionalmente simples assumir que os pixels definem uma malha´ regular de “quadrados” n˜ao sobrepostos que recobre a tela, sendo que as intersec¸c˜oes da malha definem o posicionamento dos pixels, i.e., pixels s˜ao tratados como “quadrados” com centro nas interse¸c˜oes da malha. Uma primitiva pode sobrepor toda ou parte da ´area ocupada por um pixel. Assumimos tamb´em que a linha contribui para a intensidade do pixel segundo um valor proporcional a porcentagem da ´area do pixel coberta por ela. Se a primitiva cobre toda a ´area do pixel, ele recebe a intensidade m´axima (preto, no caso), se cobre parte o pixel recebe um tom de cinza cuja intensidade ´e proporcionala ´area coberta (Figura 3.16). O efeito ´e “suavizar” a defini¸c˜ao da reta ou das arestas que definem a primitiva, melhorando sua aparˆencia visual quando observada `a distˆancia. Essa estrat´egia ´e denominada amostragem por ´area n˜ao ponderada (unweighted area sampling). Uma estrat´egia ainda mais eficiente ´e a amostragem por ´area ponderada (weighted area sampling).

Figura 3.16: A intensidade do pixel ´e proporcional `a area coberta.

Amostragem de ´Areas Ponderada

Nessa outra estrat´egia, assim como na anterior, valem duas propriedades: 1) a intensidade atribu´ıda ao pixel ´e diretamente proporcional `a ´area do mesmo coberta pela primitiva; 2) se a primitiva n˜ao intercepta a ´area do pixel, ent˜ao ela n˜ao contribui nada para a cor do mesmo. A diferen¸ca ´e que, na estrat´egia ponderada, ao determinar a contribui¸c˜ao de uma ´area considera-se, tamb´em, a sua proximidade em rela¸c˜ao ao centro do pixel. Assim, ´areas iguais podem contribuir de forma desigual: uma ´area pequena pr´oxima do centro do pixel tem maior influˆencia do que uma ´area grande a uma distˆancia maior. Entretanto, para garantir que a primitiva contribui para um pixel apenas se ela sobrep˜oe a ´area ocupada pelo mesmo, precisamos mudar a geometria do pixel da seguinte forma: vamos considerar que o pixel ocupa uma ´area

circular maior do que a ´area quadrangular considerada na situa¸c˜ao anterior. Se a primitiva sobrep˜oe essa nova ´area, ela contribui para a intensidade do pixel. Vamos definir uma fun¸c˜ao peso que determina a influˆencia, na intensidade do pixel, de uma ´area pequena da primitiva, denominada dA, em fun¸c˜ao da distˆancia de dA ao centro do pixel. No caso da amostragem n˜ao ponderada, essa fun¸c˜ao ´e constante, e no caso da amostragem ponderada, ela diminui de forma inversamente proporcional a distˆancia em rela¸c˜ao ao centro do pixel. Podemos pensar nessa fun¸c˜ao como uma fun¸c˜ao W (x, y), no plano, cuja altura em rela¸c˜ao ao plano xy d´a o peso associadoa ´area dA no ponto (x, y). Para a amostragem por ´area n˜ao ponderada, essa fun¸c˜ao ´e representada por uma ’caixa’, como indicado na Figura 3.17. A figura mostra os pixels como quadrados cujos centros (marcados) est˜ao nas intersec¸c˜oes da malha regular. A contribui¸c˜ao de cada pequena ´area ´e proporcional `a ´area multiplicada pelo peso. Portanto, a intensidade total ´e dada pela integral da fun¸c˜ao peso sobre a ´area de sobreposi¸c˜ao. O volume representado por essa integral, W s, ´e sempre uma fra¸c˜ao entre 0 e 1, e a intensidade I do pixel ´e dada por Imax.W s. No caso da amostragem n˜ao ponderada a altura da ’caixa’ ´e normalizada para 1, de forma que o volume da caixa ´e 1. No caso da ´area da linha cobrir todo o pixel, tem-se I = Imax.1 = Imax.

Figura 3.17: Filtro definido por um cubo para um pixel definido por um quadrado.

Vamos agora construir uma fun¸c˜ao peso para a amostragem ponderada: a fun¸c˜ao adotada tem valor m´aximo no centro do pixel e diminui linearmente a medida que a distˆancia ao centro aumenta, e seu gr´afico define um cone, como indicado na Figura 3.18. A base do cone ´e uma circunferˆencia cujo centro coincide com o centro do pixel, e cujo raio corresponde a uma unidade da distˆancia entre os pixels na malha. Note que as bases das fun¸c˜oes peso em diferentes pixels se sobrep˜oem, e portanto uma ´unica pequena regi˜ao da primitiva pode contribuir para a intensidade de diferentes pixels. Essa sobreposi¸c˜ao tamb´em garante que n˜ao existem ´areas da grade que n˜ao s˜ao cobertas por algum pixel (esse n˜ao seria o caso se o raio da base fosse de meia unidade, por exemplo).

Figura 3.18: Filtro cˆonico com diˆametro igual ao dobro da largura de um pixel.

Assim como na fun¸c˜ao ’caixa’, a soma das contribui¸c˜oes de intensidade para o cone ´e dada pelo

Cap´ıtulo 4

Preenchimento de Pol´ıgonos

A tarefa de preencher um pol´ıgono pode ser dividida em duas:

  1. Decidir que pixels pintar para preencher o pol´ıgono;
  2. Decidir com que valor pintar o pixel.

Geralmente decidir que pixels devem ser pintados, consiste em se varrer (scan) sucessivas linhas que interceptam a primitiva, preenchendo os pixels em “blocos” (span) que est˜ao dentro da primitiva (que define o pol´ıgono) da esquerda para a direita. Vamos considerar inicialmente o preenchimento de primitivas gr´aficas n˜ao “recortadas” (unclipped ) com uma ´unica cor. Em geral, a decis˜ao sobre quais pixels preencher ´e feita “varrendo-se” (scan) linhas sucessivas que interceptam a primitiva, e preenchendo, da esquerda para a direita, blocos de pixels adjacentes (spans) que est˜ao dentro da primitiva que define o pol´ıgono.

4.1 Retˆangulos

Para preencher um retˆangulo com uma ´unica cor, pinta-se cada pixel dentro de uma linha de varredura da esquerda para a direita com o mesmo valor de pixel, isto ´e, pode-se preencher cada “bloco” de xmin a xmax. As primitivas para blocos exploram a Coerˆencia Espacial: o fato que freq¨uentemente n˜ao h´a altera¸c˜ao nas primitivas de um pixel para outro (pixels adjacentes) dentro de um bloco (span) ou de uma linha de varredura para a pr´oxima linha de varredura. Assim, podemos explorar a coerˆencia para buscar apenas os pixels em que ocorrem mudan¸cas. Para um retˆangulo preenchido com a mesma cor, todos os pixels num bloco receber˜ao um mesmo valor, o que garante coerˆencia de bloco (span coherence). O retˆangulo tamb´em exibe coerˆencia de linha de varredura (scan-line coherence), no sentido de que linhas de varredura consecutivas que interceptam o retˆangulo s˜ao idˆenticas. Posteriormente consideraremos tamb´em coerˆencia de arestas (edge coherence) para lados de pol´ıgonos em geral. Coerˆencia ´e uma pro- priedade bastante explorada em CG, n˜ao apenas para convers˜ao matricial de primitivas 2D, mas tamb´em para visualiza¸c˜ao de primitivas 3D. A capacidade de tratar v´arios pixels identicamente em um bloco (span) tem especial importˆancia para a diminui¸c˜ao de tempo gasto para gravar os pixels no Frame Buffer (mem´oria onde ´e armazenada a imagem). Assim, se em menos acessos a mem´oria pudermos escrever mais pixels estaremos ganhando tempo. Abaixo colocaremos um algoritmo para preencher um retˆangulo, sendo que nele n´os n˜ao nos preocuparemos em escrever eficientemente na mem´oria. Deixaremos isso para discuss˜ao posterior.

Para y = ymin at´e ymax do ret^angulo { Por linha de varredura } Para x = xmin at´e xmax { Cada pixel dentro do bloco } write_pixel (x,y,valor)

Algoritmo 4.1: Trecho de Algoritmo para Preenchimento de Retˆangulo.

Consideremos agora dois retˆangulos que compartilham um mesmo lado. Se preenchermos cada retˆangulo isoladamente, o lado (aresta) compartilhado pelos dois ser´a gerado duas vezes o que n˜ao ´e desej´avel (perco tempo!). Aqui surge o problema de defini¸c˜ao de ´area pertencente a cada primitiva, isto ´e, quais os pixels que pertencem a cada primitiva e quais os pixels que n˜ao pertencem. De forma natural, podemos definir os pixels que matematicamente se encontram no interior de uma ´area definida pela primitiva, como pertencente a ela. Mas o que podemos falar acerca dos pixels que est˜ao no limite da primitiva?

Se voltamos ao nosso problema do retˆangulo podemos adotar como uma regra que: os pixels que constituem os limites da primitiva, isto ´e, os que est˜ao sobre os seus lados, n˜ao s˜ao considerados parte da primitiva se o meio-plano definido pelo lado e que cont´em a primitiva est´a abaixo ou a esquerda do lado. Ou, mais claramente, os pixels que est˜ao sobre os lados (aresta) esquerdo e inferior pertencem a primitiva e ser˜ao desenhados, por´em os lados superior e direito n˜ao pertencem a primitiva e portanto n˜ao ser˜ao desenhados. Assim, uma aresta vertical compartilhada por dois retˆangulos pertence ao lado que est´a mais a direita. Sendo que na realidade, blocos dentro de um retˆangulo representam uma intervalo que ´e fechado a esquerda e embaixo e aberto em cima e a direita. Algumas considera¸c˜oes devem ser feitas sobre esta regra:

  1. A regra se aplica da mesma forma a pol´ıgonos arbitr´arios e n˜ao somente a retˆangulos.
  2. O v´ertice do canto inferior esquerdo ainda continua sendo desenhado duas vezes.
  3. A regra pode tamb´em ser aplicada para retˆangulos e pol´ıgonos n˜ao preenchidos.
  4. A regra faz com que em cada bloco esteja faltando o seu pixel mais a direita, e em cada retˆangulo fique faltando o seu lado (aresta) superior.

Os problemas apresentados nas considera¸c˜oes acima demonstram que n˜ao h´a solu¸c˜ao perfeita para o problema de n˜ao escrever mais de uma vez linhas que sejam potencialmente compartilhadas por mais de um pol´ıgono.

4.2 Pol´ıgonos de Forma Arbitr´aria

O algoritmo que vamos discutir a seguir contempla tanto pol´ıgonos cˆoncavos quanto pol´ıgonos convexos, mesmo que eles tenham auto-intersec¸c˜ao e buracos em seu interior. Ele opera computando blocos de pixels que est˜ao entre os lados esquerdo e direito do pol´ıgono. O extremo do bloco ´e calculado por um algoritmo incremental que calcula a linha de varredura/lado de intersec¸c˜ao a partir da intersec¸c˜ao com a linha de varredura anterior.

Figura 4.1: Esta figura ilustra o processo de linha de varredura para um pol´ıgono arbitr´ario. As in- tersec¸c˜oes da linha de varredura 8 com os lados FA e CD possuem coordenadas inteiras, enquanto as intersec¸c˜oes com os lados EF e DE possuem coordenadas reais.

E preciso determinar que pixels da linha de varredura est˜´ ao dentro do pol´ıgono, e estabelecer os pixels correspondentes (no exemplo da Figura 4.1, blocos para x = 2 at´e 4 e 9 at´e 13) com seu valor apropriado. Repetindo este processo para cada linha de varredura que intercepta o pol´ıgono, o pol´ıgono inteiro ´e convertido. A Figura 4.2 ilustra este processo. Devemos nos preocupar com a defini¸c˜ao dos pontos extremos do pol´ıgono. Uma forma de obtˆe-los ´e usar o algoritmo de convers˜ao de linhas do “Ponto-M´edio” para cada lado do pol´ıgono. Note que esta estrat´egia inclui alguns pixels no extremo do pol´ıgono que na realidade n˜ao se encontram no pol´ıgono. Eles foram escolhidos pelo algoritmo de convers˜ao matricial de linhas, e s˜ao colocados sobre o lado porque est˜ao mais pr´oximas a ele. N˜ao podemos desenhar pixels que n˜ao perten¸cam verdadeiramente ao interior do pol´ıgono, pois po- demos estar invadindo o dom´ınio de outro pol´ıgono. Isto ´e, se a linha em quest˜ao define um extremo

se ele ´e o v´ertice de ymin do lado adjacente. Por exemplo, na Figura 4.1, o v´ertice A ´e contado uma vez no c´alculo de paridade porque ´e o v´ertice de ymin para o lado FA, mas ´e tamb´em o v´ertice de ymax para o lado AB. Assim ambos os lados e blocos s˜ao tratados como intervalos que s˜ao fechados em seu valor m´ınimo e abertos em seu valor m´aximo.

IV Como tratar o caso especial de II em que os v´ertices definem uma linha horizontal? Assim como no caso dos retˆangulos, arestas horizontais inferiores s˜ao tra¸cadas, e arestas horizontais superiores n˜ao s˜ao. Como veremos, isso acontece automaticamente se n˜ao contarmos os v´ertices dessas arestas no c´alculo da paridade, o que ´e natural, j´a que eles n˜ao correspondem a v´ertices ymin ou ymax.

Ilustremos este processo, aplicando essas regras `a linha de varredura 8, na Figura 4.1. Os pixels ser˜ao preenchidos a partir do ponto a (coordenadas (2, 8)), at´e o primeiro pixel a esquerda do ponto b (coordenadas (4, 8)); e do primeiro pixel a direita do ponto c (coordenadas (9, 8)) at´e 1 pixel a esquerda do ponto d (coordenadas (12, 8)). Para a linha de varredura 3, o v´ertice A conta uma vez porque ´e o v´ertice de ymin do lado FA (e ´e tamb´em o v´ertice ymax do lado AB), isto causa paridade ´ımpar, assim o bloco ´e desenhado a partir de A at´e um pixel a esquerda da intersec¸c˜ao com o lado CB, onde a paridade ´e estabelecida como par e o bloco ´e terminado. A linha de varredura 1 passa apenas pelo v´ertice B, e os lados AB e BC tem como v´ertice de ymin B, o qual ´e dessa forma contado como paridade par. Este v´ertice atua como um bloco nulo, pois a linha de varredura entra pelo v´ertice, desenha o pixel e sai por ele mesmo. Assim, um pixel m´ınimo local ´e pintado, por´em pixel de m´aximo local n˜ao o ´e. Isso acontece com a intersec¸c˜ao da linha de varredura 9 com o v´ertice F, compartilhado pelos lados FA e EF. Para ambos os lados, B ´e v´ertice ymax, e dessa forma n˜ao afeta a paridade, que continua par.

Figura 4.3: Tratamento dos lados horizontais de um pol´ıgono.

4.2.1 Arestas Horizontais

Examinemos os casos apresentados na Figura 4.3. Consideremos o lado AB (lado inferior). O v´ertice A ´e v´ertice ymin para o lado JA, e AB por ser horizontal n˜ao possui m´ınimo. Assim, a paridade ´e ´ımpar (pela regra da paridade!) e o bloco (span) ´e desenhado. O lado vertical BC tem ymin em B, e pela mesma raz˜ao anterior o lado AB n˜ao contribui para alterar a paridade, assim a paridade torna-se par e o bloco termina. O lado IJ tem v´ertice ymin em J (e em JA ele ´e m´aximo) assim a paridade torna-se ´ımpar e o bloco ´e desenhado at´e o lado BC. O bloco que come¸ca em IJ e encontra C, n˜ao termina a´ı, porque C ´e ymax para BC, assim o bloco continua sobre o lado CD (at´e D), no entanto DE tem ymin em D e a paridade torna-se par e o bloco termina. O lado IJ tem ymax em I e o lado HI n˜ao contribui para a c´alculo da paridade, assim a paridade continua e o bloco sobre o lado HI n˜ao ´e desenhado. Entretanto, o lado GH tem v´ertice ymin em H, e a paridade torna-se ´ımpar, e o bloco ´e desenhado a partir de H at´e o pixel a direita da intersec¸c˜ao da linha de varredura com o lado EF. Finalmente n˜ao h´a v´ertice ymin em G nem em F, e dessa forma o lado (que ´e o lado superior - topo) FG n˜ao ´e desenhado.

OBSERVAC¸ ˜OES:

  • O algoritmo acima contempla pol´ıgonos que possuem auto-intersec¸c˜ao. Mas n˜ao desenha os pixels das arestas superiores nem os das arestas `a direita, mesmo se a primitiva for isolada.
  • N˜ao desenha os pixels sobre o topo interno de um pol´ıgono cˆoncavo em formato de U.
  • N˜ao desenha os pixels que s˜ao pontos m´aximos locais.
  • Neste algoritmo, em vez de escrever pixels em lugares errados, pixels n˜ao s˜ao escritos (mesmo em seus lugares certos!).

4.2.2 Slivers

Existe um outro problema com o nosso algoritmo de convers˜ao matricial: pol´ıgonos com lados muito pr´oximos criam um “sliver” - uma ´area poligonal t˜ao estreita que seu interior n˜ao cont´em um bloco de pixels para cada linha de varredura (Figura 4.4). Devido a regra de que s˜ao tra¸cados apenas os pixels que estejam no interior ou sobre arestas inferiores ou a esquerda, podem existir muitas linhas de varredura com um ´unico pixel, ou sem nenhum. A ausˆencia de pixels ´e um outro exemplo do problema de aliasing, ou seja, da representa¸c˜ao de um sinal cont´ınuo atrav´es de uma aproxima¸c˜ao discreta (digital). Para melhorar a aparˆencia nesses casos, pode-se usar t´ecnicas de antialiasing (se tivermos m´ultiplos bits por pixel). Antialiasing implicaria em “suavizar” nossa regra de “tra¸car apenas pixels que estejam no interior ou numa aresta inferior oua esquerda”, de forma a permitir que pixels na fronteira ou mesmo no exterior do pol´ıgono assumam intensidades variando como uma fun¸c˜ao da distˆancia entre o centro do pixel e a primitiva. Nesse caso, m´ultiplas primitivas podem contribuir para o valor de um pixel.

Figura 4.4: Exemplo de uma convers˜ao matricial de um Sliver

4.2.3 Algoritmo para Convers˜ao Matricial de Segmento de Reta que Utiliza

“Coerˆencia de Arestas” de um Pol´ıgono

No m´etodo anterior us´avamos “for¸ca bruta” para calcular a intersec¸c˜ao da linha de varredura com os lados de um pol´ıgono. Mas, freq¨uentemente, somente poucos lados de um pol´ıgono s˜ao de interesse para uma dada linha de varredura. Al´em disso, notemos que muitos lados interceptados por uma linha de varredura i tamb´em o s˜ao pela linha de varredura i + 1. Esta “Coerˆencia de Arestas” ocorre para muitas linhas de varreduras que interceptam um lado. Ao movermos de uma linha de varredura para a pr´oxima, podemos calcular o pr´oximo x da intersec¸c˜ao da linha de varredura com o lado, a partir do x da linha de varredura anterior que interceptou o lado. Usando a mesma t´ecnica do algoritmo do “Ponto-M´edio”, temos:

xi+1 = xi +

m

onde m = ((ymaxxmax−−yminxmin)) ´e a inclina¸c˜ao da aresta. No algoritmo do ponto-m´edio para convers˜ao matricial de segmentos de reta, evitamos usar aritm´etica fracion´aria calculando uma vari´avel de decis˜ao inteira, e verificando o seu sinal para escolher o pixel mais pr´oximo `a reta “verdadeira”. Aqui, tamb´em gostar´ıamos de usar aritm´etica inteira para calcular o pixel interior mais pr´oximo da verdadeira intersec¸c˜ao. Consideremos arestas com inclina¸c˜ao maior que 1 que s˜ao arestas a esquerda. Arestas a direita e outras inclina¸c˜oes s˜ao tratadas com argumentos similares aos que ser˜ao vistos para esse caso, e arestas verticais s˜ao casos especiais. (Arestas horizontais s˜ao tratadas implicitamente pelas regras de tra¸cado de blocos, como vimos anteriormente.) Precisamos tra¸car um pixel no extremo (xmin, ymin). A medida que y ´e incrementado, a coordenada x do ponto na linha ideal ser´a aumentada de (^) m^1. Este aumento resultar´a num valor de x com uma parte inteira e uma parte fracion´aria, a qual pode ser expressa como uma fra¸c˜ao com denominador igual a

AET para as linhas de varredura 9 e 10 daquele pol´ıgono. Uma vez constru´ıda a ET, os passos para o algoritmo de convers˜ao de arestas s˜ao dados no Algoritmo 4.3. Este algoritmo explora coerˆencia de arestas para calcular o valor x das intersec¸c˜oes e coerˆencia de linhas de varredura (juntamente com ordena¸c˜ao) para calcular blocos. Uma vez que a ordena¸c˜ao trabalha com um n´umero pequeno de arestas, e a reordena¸c˜ao do passo 3.6 ´e feita numa lista quase que totalmente ordenada, pode-se usar um m´etodo de ordena¸c˜ao por inser¸c˜ao, ou o m´etodo bubblesort, que ´e O(N ).

Figura 4.5: ET para o pol´ıgono de Figura 4.1.

Para efeito de convers˜ao matricial, triˆangulos e trapez´oides podem ser tratados como casos especiais de pol´ıgonos, uma vez que possuem apenas dois lados para cada linha de varredura (lembre-se que lados horizontais n˜ao s˜ao convertidos explicitamente). Na verdade, como um pol´ıgono arbitr´ario sempre pode ser decomposto numa malha de triˆangulos que compartilham v´ertices e arestas, poder´ıamos converter um pol´ıgono decompondo-o numa malha de triˆangulos, convertendo os triˆangulos a seguir. Este ´e um problema cl´assico da geometria computacional, o da triangula¸c˜ao. O processo de decomposi¸c˜ao ´e simples para pol´ıgonos convexos.

Figura 4.6: AET para o pol´ıgono da Figura 4.1 a) linha de varredura 9 b) linha de varredura 10. Note que a coordenada x da aresta DE em (b) foi arredondada para cima..

Note que o c´alculo dos blocos ´e cumulativo. Ou seja, quando a itera¸c˜ao corrente do algoritmo de convers˜ao de arestas gera um ou mais pixels na mesma linha de varredura que os pixels gerados an- teriormente, os blocos devem ser atualizados se um novo pixel tem um valor de x m´aximo ou m´ınimo mais extremo. Tratar casos de c´alculo de blocos para arestas que se cruzam, ou para slivers requer um tratamento especial. Podemos calcular os blocos num passo, e preechˆe-los num segundo passo, ou calcu- lar um bloco e preenchˆe-lo num ´unico passo. Outra vantagem de se utilizar blocos ´e que o processo de clipping pode ser feito simultaneamente ao c´alculo dos blocos: os blocos podem ser recortados (clipped ) individualmente nas coordenadas esquerda e direita do retˆangulo de corte.

  1. Obt´em a menor coordenada y armazenada na ET; ou seja, o valor de y do primeiro “cesto” n˜ao vazio.
  2. Inicializa a AET como vazia.
  3. Repita at´e que a ET e a AET estejam vazias:

3.1. Transfere do cesto y na ET para a AET as arestas cujo ymin = y (lados que est˜ao come¸cando a serem varridos), mantendo a AET ordenada em x, 3.2. Retira os lados que possuem y = ymax (lados n˜ao mais envolvidos nesta linha de varredura, 3.3. Desenhe os pixels do bloco na linha de varredura y usando pares de coordenadas x da AET. 3.4. Incremente y de 1 (coordenada da pr´oxima linha de varredura). 3.5. Para cada aresta n˜ao vertical que permanece na AET, atualiza x para o novo y. 3.6. Como o passo anterior pode ter desordenado a AET, reordena a AET.

Algoritmo 4.3: Algoritmo de convers˜ao de arestas baseado na coerˆencia de arestas.

Figura 5.1: Transla¸c˜ao de uma casa.

Figura 5.2: Mudan¸ca de escala de uma casa. Como a escala ´e n˜ao uniforme, sua propor¸c˜ao ´e alterada.

Na figura 5.2 a casa sofre uma escala de 12 em x e de 14 em y. Observe que a escala ´e feita em rela¸c˜ao a origem. Assim a casa fica menor e mais pr´oxima da origem. Tamb´em as propor¸c˜oes da casa s˜ao alteradas, isto ´e, uma escala em que sx ´e diferente de sy. Por´em ao utilizar-se escalas uniformes (sx = sy ) as propor¸c˜oes n˜ao s˜ao afetadas. A Rota¸c˜ao de pontos atrav´es de um ˆangulo θ qualquer tamb´em ´e feita a partir da origem. A rota¸c˜ao ´e definida matematicamente por:

x′^ = x. cos(θ) − y. sin(θ) y′^ = x. sin(θ) + y. cos(θ) (5.6)

e matricialmente:

P ′^ = R · P ⇒

[

x′ y′

]

[

cos θ − sin θ sin θ cos θ

]

[

x y

]

Escala e Rota¸c˜ao a partir de qualquer ponto ser˜ao tratadas posteriormente. Os ˆangulos positivos s˜ao definidos quando a rota¸c˜ao ´e feita no sentido contr´ario aos do ponteiro do rel´ogio, e ˆangulos negativos quando a rota¸c˜ao ´e feita no sentido dos ponteiros do rel´ogio. Lembremos que sin(−θ) = − sin(θ) e que cos(−θ) = cos(θ). Observando a Figura 5.4 vemos que a rota¸c˜ao por θ transforma P (x, y) em P ′(x′, y′). Como a rota¸c˜ao ´e em rela¸c˜ao a origem, as distˆancias de P e P ′^ a origem, r na figura, s˜ao iguais. Assim, temos que:

x = r. cos(φ) y = r. sin(φ) (5.8)

x′^ = r · cos(θ + φ) = r. cos(φ). cos(θ) − r. sin(φ) sin(θ) y′^ = r · sin(θ + φ) = r cos(φ) sin(θ) + r. sin(φ). cos(θ) (5.9)

Podemos obter a Equa¸c˜ao 5.6, substituindo a Equa¸c˜ao 5.8 na Equa¸c˜ao 5.9.

Figura 5.3: Esta figura mostra a rota¸c˜ao da casa por 45◦. Da mesma forma que para a escala, a rota¸c˜ao tamb´em ´e feita em rela¸c˜ao a origem.

Figura 5.4: Derivando a equa¸c˜ao de rota¸c˜ao.

5.2 Coordenadas Homogˆeneas e Matrizes de Transforma¸c˜ao

Para a Transla¸c˜ao, Escala e Rota¸c˜ao, as matrizes de transforma¸c˜ao s˜ao respectivamente:

P ′^ = T + P (5.10)

P ′^ = S · P (5.11)

P ′^ = R · P (5.12)

Infelizmente, a transla¸c˜ao ´e tratada de forma diferente (como uma soma) das outras - Rota¸c˜ao e Escala - que s˜ao tratadas atrav´es de multiplica¸c˜oes. Para que possamos combinar facilmente essas trans- forma¸c˜oes, devemos poder tratar do mesmo modo todas as 3 transforma¸c˜oes de uma forma consistente. Se os pontos s˜ao expressos em Coordenadas Homogˆeneas, todas as 3 transforma¸c˜oes podem ser tra- tadas como multiplica¸c˜oes. Em coordenadas homogˆeneas, adicionamos uma terceira coordenada ao ponto. Logo, em vez de um ponto ser representado por um par de valores (x, y), ele ´e representado por uma tripla (x, y, W ). Dizemos que 2 conjuntos de coordenadas homogˆeneas (x, y, W ) e (x′, y′, W ′) representam o mesmo ponto se e somente se um ´e m´ultiplo do outro. Assim, (2, 3 , 6) e (4, 6 , 12) ´e o mesmo ponto representado por diferentes triplas. Isto ´e, cada ponto tem muitas diferentes representa¸c˜oes homogˆeneas. Tamb´em, pelo menos uma das coordenadas homogˆeneas precisa ser diferente de zero, assim (0, 0 , 0) n˜ao ´e permitido. Se W ´e a coordenada n˜ao zero, podemos dividir (x, y, W ) por ela, obtendo o mesmo ponto ( (^) Wx , (^) Wy , 1). Os n´umeros (^) Wx e (^) Wy s˜ao chamados de Coordenadas Cartesianas do ponto homogˆeneo. Usualmente, triplas representam pontos em um espa¸co 3D, mas agora est˜ao sendo usadas para representar pontos em 2D. Observemos que, se tomarmos todas as triplas que representam o mesmo ponto, isto ´e, todas as triplas da forma (tx, ty, tW ) com t diferente de 0, obtemos uma linha no espa¸co 3D. Se homogeneizamos o ponto (dividimos por W ), obtemos um ponto da forma (x, y, 1). Logo, os pontos homogeneizados formam o plano definido pela equa¸c˜ao W = 1 no espa¸co (x, y, W ). A Figura 5.5, mostra esse relacionamento. Como agora os pontos s˜ao vetores de 3 elementos, as matrizes de transforma¸c˜oes que multiplicam um ponto por outro tamb´em precisam ser de 3x3. A equa¸c˜ao de Transla¸c˜ao 5.1 para coordenadas homogˆeneas fica:

x′ y′ 1

sx 0 0 0 sy 0 0 0 1

x y 1

e definindo,

S(sx, sy ) =

sx 0 0 0 sy 0 0 0 1

temos

P ′^ = S(sx 1 , sy 1 ) · P (5.23) P ′′^ = S(sx 2 , sy 2 ) · P ′^ (5.24)

e substituindo:

P ′′^ = S(sx 2 , sy 2 ) · [S(sx 1 , sy 1 ) · P ] = [S(sx 2 , sy 2 ).S(sx 1 , sy 1 )] · P (5.25)

A matriz produto S(sx 2 , sy 2 ) · S(sx 1 , sy 1 ) ´e:  

sx 2 0 0 0 sy 2 0 0 0 1

sx 1 0 0 0 sy 1 0 0 0 1

sx 1 .sx 2 0 0 0 sy 1 .sy 2 0 0 0 1

e temos que a Escala ´e multiplicativa. Finalmente, verifiquemos como ficam as equa¸c˜oes de rota¸c˜ao:

 

x′ y′ 1

cos θ − sin θ 0 sin θ cos θ 0 0 0 1

x y 1

Definindo:

R(θ) =

cos θ − sin θ 0 sin θ cos θ 0 0 0 1

temos que:

P ′^ = R(θ) · P (5.29)

Como exerc´ıcio, mostre que duas rota¸c˜oes s˜ao aditivas!

Figura 5.6: Um cubo unit´ario ´e rodados 45 graus, posteriormente escalado n˜ao uniformemente. Obtem-se dessa forma uma transforma¸c˜ao afim.

Uma sequˆencia arbitr´aria de rota¸c˜oes, transla¸c˜oes e escalas, s˜ao chamadas de transforma¸c˜oes afins. As Transforma¸c˜oes Afins preservam paralelismo de linhas, mas n˜ao comprimentos e ˆangulos. A figura 5.6, mostra o resultado de se aplicar uma rota¸c˜ao de 45◦^ e depois uma escala n˜ao uniforme a um cubo unit´ario. Uma matriz de transforma¸c˜ao da forma:

M =

r 11 r 12 tx r 21 r 22 ty 0 0 1

onde a submatriz 2x2 do canto superior esquerdo ´e ortogonal, preserva ˆangulos e comprimentos. Estas transforma¸c˜oes s˜ao chamadas de Corpo R´ıgido, porque o corpo do objeto n˜ao ´e distorcido de forma alguma.

5.3 Transforma¸c˜oes 2D Adicionais: Espelhamento e Shearing

Duas transforma¸c˜oes adicionais bastante usadas em CG s˜ao o Espelhamento (Reflex˜ao) e Distor¸c˜ao (Shearing), discutidas a seguir.

5.3.1 Espelhamento (Mirror)

A transforma¸c˜ao de reflex˜ao, ou espelhamento, aplicada a um objeto, produz um objeto que ´e o espelho do original. No caso de uma reflex˜ao 2D, o espelho ´e gerado relativamente a um eixo de reflex˜ao rotacionando o objeto de 180oem torno do eixo de reflex˜ao. Por exemplo, pode-se aplicar uma reflex˜ao em torno da linha y = 0 (o eixo x) usando a seguinte matriz de transforma¸c˜ao:

M irrorv =

Esta transforma¸c˜ao mant´em as coordenadas x do objeto inalteradas, mas “inverte” os valores das coordenadas y, alterando a orienta¸c˜ao espacial do objeto. Analogamente, poder´ıamos definir uma reflex˜ao em torno do eixo y, que “inverteria” as coordenadas x do objeto.

Figura 5.7: Reflex˜ao de um objeto em torno do eixo x.

Podemos tamb´em definir uma reflex˜ao em torno de um eixo perpendicular ao plano xy e passando (por exemplo) pela origem do sistema de coordenadas, “invertendo” nesse caso ambas as coordenadas x e y. A matriz de transforma¸c˜ao ´e dada por:

M irrorxy =

x′^ = x + shx(y − yref ) y′^ = y (5.36)

Analogamente, pode-se aplicar uma distor¸c˜ao na dire¸c˜ao y, relativa a uma linha x = xref, usando

Shearxref =

shy 1 −shy .xref 0 0 1

que gera as seguintes transforma¸c˜oes nas posi¸c˜oes das coordenadas:

x′^ = x y′^ = y + shy .(x − xref ). (5.38)

Esta transforma¸c˜ao desloca as coordenadas de uma posi¸c˜ao verticalmente segundo um fator propor- cional `a sua distˆancia da linha de referˆencia x = xref. Qualquer opera¸c˜ao de distor¸c˜ao pode ser descrita como uma composi¸c˜ao de transforma¸c˜oes envolvendo uma seq¨uˆencia de matrizes de rota¸c˜ao e escala.

5.4 Transforma¸c˜oes entre sistemas de coordenadas

J´a vimos que aplica¸c˜oes gr´aficas freq¨uentemente requerem a transforma¸c˜ao de descri¸c˜oes de objetos de um sistema de coordenadas para outro. Muitas vezes, o objeto ´e descrito em um sistema de coordenadas n˜ao Cartesiano (como coordenadas polares ou el´ıpticas), e precisa ser convertido para o sistema de coordenadas Cartesiano do dispositivo. Em aplica¸c˜oes de design e modelagem, objetos individuais s˜ao definidos em seu pr´oprio sistema de coordenadas, e as coordenadas locais devem ser transformadas para posicionar os objetos no sistema de coordenadas global da cena. Neste texto vamos considerar especificamente transforma¸c˜oes entre dois sistemas de coordenadas Cartesianos. Para transformar descri¸c˜oes de um objeto dadas em um sistema de coordenadas xy para um sistema x′y′^ com origens em (0, 0) e (x 0 , y 0 ), com um ˆangulo de orienta¸c˜ao θ entre os eixos x e x′, precisamos determinar a transforma¸c˜ao que superp˜oe os eixos xy aos eixos x′y′. Isso pode ser feito em 2 passos:

  1. transladar o sistema x′y′^ de modo que sua origem coincida com a origem do sistema xy: T (−x 0 , −y 0 )
  2. Rotacionar o eixo x′^ de forma que ele coincida com o eixo x: R(−θ)

Concatenando as duas matrizes de transforma¸c˜ao obt´em-se a matriz de composi¸c˜ao que descreve a transforma¸c˜ao necess´aria:

Mxy,x′y′^ = R(−θ) · T (−x 0 , −y 0 ) (5.39)

Um m´etodo alternativo para estabelecer a orienta¸c˜ao do segundo sistema de coordenadas consiste em especificar um vetor V na dire¸c˜ao positiva do eixo y′, passando pela origem do sistema xy. O vetor V ´e especificado como um ponto no sistema de referˆencia xy em rela¸c˜ao `a origem do sistema xy. Um vetor unit´ario que d´a a dire¸c˜ao de y′^ pode ent˜ao ser obtido:

v =

V

|V |

= (vx, vy ) (5.40)

E obtemos o vetor unit´ario ~u ao longo do eixo x′^ rotacionando v de 90o^ no sentido hor´ario:

u = (vy , −vx) = (ux, uy ) (5.41)

J´a vimos que os elementos de uma matriz de rota¸c˜ao podem ser expressos como elementos de um conjunto de vetores ortogonais. Portanto, a matriz de rota¸c˜ao a ser usada para rotacionar o sistema x′y′ para que este coincida com o sistema xy ´e dada por:

R =

ux uy 0 vx vy 0 0 0 1

Por exemplo, se escolhermos que a nova orienta¸c˜ao deve ser dada pelos vetores U = (0, 1) (eixo y positivo no sistema atual) e V = (− 1 , 0) (eixo x negativo no sistema atual), a matriz de rota¸c˜ao ´e dada por:

R =

Essa matriz ´e equivalente `a matriz de rota¸c˜ao para θ = 90o

5.5 Composi¸c˜ao de Transforma¸c˜oes

Usaremos composi¸c˜ao como uma combina¸c˜ao de matrizes de transforma¸c˜ao R, S e T. O prop´osito de compor-se transforma¸c˜oes, ´e o ganho de eficiˆencia que se obt´em ao aplicar-se uma transforma¸c˜ao composta a um ponto em vez de aplicar-lhe uma s´erie de transforma¸c˜oes, uma ap´os a outra. Considerando a rota¸c˜ao de um objeto em torno de um ponto arbitr´ario P 1. Mas sabemos apenas rotacionar um ponto em rela¸c˜ao a origem. Assim, podemos dividir este problema de rota¸c˜ao em 3 problemas simples, ou seja: para rotacionar em rela¸c˜ao a P 1, pode-se usar a seguinte sequˆencia de transforma¸c˜oes fundamentais:

  1. Efetuar uma transla¸c˜ao, levando P 1 `a origem.
  2. Efetuar a Rota¸c˜ao desejada.
  3. Efetuar uma Transla¸c˜ao oposta `a realizada em (1), levando P 1 a posi¸c˜ao anterior.

Figura 5.9: Rota¸c˜ao em rela¸c˜ao ao Ponto P 1, por um ˆangulo θ.

Esta sequˆencia ´e ilustrada na figura 5.9, onde a casa ´e rotacionada em rela¸c˜ao a P 1 (x 1 , y 1 ). A primeira transla¸c˜ao ´e por (−x 1 , −y 1 ), e a ´ultima transla¸c˜ao (oposta a primeira) ´e por (x 1 , y 1 ). A transforma¸c˜ao em sequˆencia ´e:

T (x 1 , y 1 ) · R(θ) · T (x 1 , y 1 ) =

1 0 x 1 0 1 y 1 0 0 1

cos θ − sin θ 0 sin θ cos θ 0 0 0 1

1 0 −x 1 0 1 −y 1 0 0 1

cos θ − sin θ x 1 (1 − cos θ) + y 1. sin θ sin θ cos θ y 1 (1 − cos θ) + x 1. sin θ 0 0 1

Esse procedimento pode ser usado de forma similar para se efetuar a Escala de um objeto em rela¸c˜ao a um ponto arbitr´ario P 1. Primeiramente o ponto P 1 ´e transladado para a origem, ent˜ao ´e feita a escala desejada, e ent˜ao o ponto P 1 ´e transladado de volta. Dessa forma, a transforma¸c˜ao em seq¨uˆencia ´e: