































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
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
1 / 39
Esta página não é visível na pré-visualização
Não perca as partes importantes!
































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
A tarefa de preencher um pol´ıgono pode ser dividida em duas:
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.
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:
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.
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.
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.
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
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.
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:
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.
Para a Transla¸c˜ao, Escala e Rota¸c˜ao, as matrizes de transforma¸c˜ao s˜ao respectivamente:
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:
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.
Duas transforma¸c˜oes adicionais bastante usadas em CG s˜ao o Espelhamento (Reflex˜ao) e Distor¸c˜ao (Shearing), discutidas a seguir.
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.
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:
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 =
= (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:
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:
Essa matriz ´e equivalente `a matriz de rota¸c˜ao para θ = 90o
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:
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: