Loading
Study Reminders
Support
Text Version

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Olá e bem-vindos à palestra número 26 no curso Computer Graphics, continuaremos nossa discussão sobre o pipeline gráfico. Para uma recapitinha rápida, vamos apenas passar pelos palcos.
Então, já discutimos o primeiro estágio que é representação de objetos, transformação de modelagem de segunda fase, iluminação de terceiro estágio, pipeline de visualização de quarto estágio e o único estágio que resta é a quinta etapa de conversão de varredura. Atualmente estamos discutindo a quinta etapa.
Na última palestra, conversamos sobre renderização de linhas, que faz parte da quinta etapa. E lá falamos sobre uma abordagem muito intuitiva, bem como uma abordagem um pouco melhorada que são os métodos DDA. Hoje, continuaremos nossa discussão sobre renderização de linha, onde falaremos sobre abordagem ainda melhor. E também vamos discutir renderização de círculos.
Agora, antes de entrarmos na discussão sobre uma melhor abordagem de renderização de linha, vamos recapitear rapidamente o que vimos na palestra anterior sobre renderização de linha.
Por isso, a ideia era mapear uma descrição de viewport a uma grade de pixels. Esse é, naturalmente, o objetivo da quinta etapa.
Para isso, a abordagem mais simples é apenas arredondar as coordenadas reais para os inteiros mais próximos, que são pixels, por exemplo, de (2,3, 2,6) para (2, 3). Agora, isso é bom para pontos mas para mapear linhas ou círculos ou outras formas primitivas, isso pode não ser bom.
E para linha o que fizemos? Por isso, primeiro assumimos que um segmento de linha é definido pelos endpoints. E o nosso objetivo é mapear todos os pontos que estão na linha para os pixels apropriados.
A abordagem direta que discutimos é que primeiro mapeamos os pontos finais a pixels, então começamos com um terminal que está tendo os valores de coordenadas inferiores x e y, então trabalhamos com valores de coordenadas y para sucessivas coordenadas x, em que as coordenadas x diferem em 1 porque estamos falando grids pixels. E então, esse valores y que nós computamos são mapeados para o número inteiro mais próximo conseguindo assim os pixels.
Agora, essa abordagem tem dois problemas. Em primeiro lugar, exigimos multiplicação que é uma operação de ponto flutuante. E em segundo lugar, exigimos arredondamento que também é uma operação de ponto flutuante. Agora, essas operações de ponto flutuante são computacionalmente caras e podem resultar em renderização mais lenta de linhas.
Para melhorar, discutimos uma abordagem incremental. Lá nós não fomos para a multiplicação, em vez disso nós utilizamos adição. Por isso, para computar y, nós simplesmente adicionamos este m valor ao valor atual, ou para computar x, novo x, nós simplesmente adicionamos este valor de 1 por m ao valor atual x. Agora quando escolher se computar x ou y, isso depende da ladeira. Portanto, se o valor m está dentro dessa faixa, então nós computamos y dado x, caso contrário, computamos x dado y usando a equação de linha.
Agora, a DDA pode reduzir algumas operações de ponto flutuante como já discutimos, particularmente multiplicações. No entanto, ainda requer outras operações de ponto flutuante, a saber, adições e arredondamentos. Por isso, ainda não é completamente eficiente por assim dizer, e exigimos uma abordagem melhor. Uma dessas abordagens é dada pelo algoritmo de Bresenham.
Agora, essa é uma maneira eficiente de escanear segmentos de linha de conversão e discutiremos o algoritmo assumindo m estar dentro destes intervalos. Isso significa que vamos nos concentrar na computação y valor dado o valor x.
Agora, vamos tentar entender a situação. Suponhamos, este é o ponto real na linha e estamos caminhando ao longo da direção de x, a posição atual é dada por este ponto (xk, yk). Agora, o ponto real na linha é um número real de número de ponto flutuante, por isso precisamos mapeá-lo para o ponto de grade do pixel mais próximo.
Agora, há dois candidatos em potencial para isso, um é esse pixel ou o pixel candidato superior que é (xk + 1, yk + 1), e o outro é o pixel candidato inferior que é (xk + 1, yk), e temos que escolher 1 desses. Como escolher isso?
Nosso objetivo é escolher um pixel que esteja mais próximo com relação ao outro pixel até a linha original. Então, entre esses dois pixels, temos que decidir qual deles está mais perto da linha original e escolher esse pixel.
Deixe-nos denotar por dupper, a distância do pixel (xk + 1), (yk + 1) da linha que é o candidato superior pixel da linha como mostrado aqui. Similarmente, d inferior indica a distância do pixel candidato inferior da linha.
Agora, em (xk + 1), isso é nesses pontos y é dado por essa expressão usando a equação da linha, onde m é a inclinação. Então podemos dizer que d superior pode ser dado por ((yk + 1)-y), é esse valor menos este valor y, que é dado aqui ou esta expressão.
Da mesma forma, a dlower também pode ser dada como y menos yk. Como você pode ver aqui, este é o valor y e este é o valor yk. Então, substituindo o y dessa equação, você pode obter essa expressão. Agora, vamos fazer algum truque matemático sobre essas expressões.
Mas antes disso, devemos notar que se a diferença for menor que 0 então o pixel inferior está mais próximo e nós escolhemos ele, caso contrário, escolhemos o pixel superior. Distância entre os valores y aqui, aqui, e aqui; as duas distâncias que temos usado ao expressar dupper e dlower. Se a diferença for menor que 0, então escolhemos o pixel inferior porque esse ponto está mais próximo da linha, caso contrário, escolhemos o pixel superior.
Agora, vamos substituir m com esta proporção, Δy / Δx, onde Δy é a diferença de coordenada y entre os terminais e Δx é a diferença de coordenadas x entre os endpoints. E então reorganizamos e substituímos esta expressão por c, que é um termo constante. Como você pode ver aqui, todos são constantes.
Então o que nós conseguimos? Este termo para ser igual a este termo, ambos os lados nós multiplicamos por Δx e substituímos m por estas expressões. Reorganizando e expandindo, obtemos isso, então substituímos este termo constante aqui com c para obter essa expressão. Trata-se de uma simples manipulação dos termos.
Agora, vamos denotar o lado esquerdo por pk, chamamos de parâmetro de decisão para a etapa de kth. Agora, esse parâmetro é usado para decidir a proximidade de um pixel para a linha. Agora, seu signo será o mesmo que o do sinal da diferença dabaixo-dupper.
Assim, se pk˂0, então este pixel inferior fica mais próximo da linha e nós escolhemos, caso contrário, escolhemos o pixel superior.
Então isso está no passo k. Agora, na etapa k + 1 que é o próximo passo, a gente pega pk + 1. Agora, isso é essencialmente dado por esta expressão onde substituímos xk com xk + 1 e yk com yk + 1. Estes dois termos substituímos com o próximo termo. Depois, tiramos uma diferença entre os dois, pk + 1-pk, que nos dá essa expressão.
Agora, nós sabemos porque estamos lidando com uma grade de pixels que xk + 1 é essencialmente xk + 1. Assim, podemos reorganizar e reescrever a expressão como pk + 1 = pk + 2Δy-{este termo}. Isso significa que a variável de decisão na etapa k + tinto é dada pela variável de decisão em kth passo mais um termo; este e esse termo.
Agora, se pk