Transformações em Imagens Vetoriais no Plano
Afluentes: Computação Gráfica
Representação
|
Por exemplo, se tivermos um triângulo, composto de três pontos e linhas ligando cada um dos pontos, então teremos:
Ponto { Real x Real y } Triangulo = Vetor [3] Ponto Triangulo.Ponto[0]( 5, 10); Triangolo.Ponto[1](10, 5); Triangulo.Ponto[2](15, 10); j = 1; Para i = 0 até 2 Fazer j = i + 1; Se j > 2 Então j = 0 Fim se Desenhar_linha( Triangulo[i].Ponto.x, Triangulo[i].Ponto.y, Triangulo[j].Ponto.x, Triangulo[j].Ponto.y) Fim para
O código em C do arquivo ret.c apresenta a estrutura de um retângulo e uma operação de translação sobre a figura criada atraves da utilização das setas direcionais do teclado.
Transformações
As transformações são operações feitas nos objetos existentes, no plano bidimensional nesse caso, de forma que eles sejam modificados. Existem diversos tipos de operações, mas veremos apenas as transformações de translação, escala e rotação.
Translação
|
A operação da translação ocorre com a soma da matriz de translação com todos os pontos do objeto. A matriz de translação é a seguinte:
[ Tx Ty ]
tal que:
Tx é a translação na horizontal e Ty é a translação na vertical
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
[ x y ] + [ Tx Ty ]
tal que:
x = x + Tx y = y + Ty
Algoritmo
Baseado na matriz e na fórmula para a operação de translação no plano, o algoritmo para esta operação fica da seguinte maneira:
Entrada Tx e Ty Para i = 0 Até Quantidade_de_pontos Fazer Ponto[i].x = Ponto[i].x + Tx Ponto[i].y = Ponto[i].y + Ty Fim para
Ou seja, a operação é executada em todos os pontos do elemento.
Exemplo
Agora imagine que vamos executar a operação de translação no nosso triângulo (Figura 1). Considere que vamos executar a operação de translação com os seguintes valores de Tx e Ty respectivamente (-2, 7). Então teremos que:
Ponto[0].x = Ponto[0].x + Tx = 5 + (-2) = 3 Ponto[0].y = Ponto[0].y + Ty = 10 + 7 = 17 Ponto[0].x = Ponto[0].x + Tx = 10 + (-2) = 8 Ponto[0].y = Ponto[0].y + Ty = 5 + 7 = 12 Ponto[0].x = Ponto[0].x + Tx = 15 + (-2) = 13 Ponto[0].y = Ponto[0].y + Ty = 10 + 7 = 17
Logo, nossos pontos passarão a ser:
Pontos (3, 17), (8, 12) e (13, 17)
Gerando uma nova imagem com o elemento Triângulo em uma nova posição.
Escala
|
A operação da escala ocorre com a multiplicação da matriz de Escala com todos os pontos do objeto. A matriz de escala é a seguinte:
| Sx 0 | | 0 Sy |
tal que:
Sx é a modificação da escala na horizontal e Sy é a modificação da escala na vertical
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
[ x y ] * | Sx 0 | | 0 Sy |
tal que:
x = (x * Sx) + (y * 0) = x * Sx y = (x * 0) + (y * Sy) = y * Sy
Algoritmo
Baseado na matriz e na fórmula para a operação de escala no plano, o algoritmo para esta operação fica da seguinte maneira:
Entrada Sx e Sy Para i = 0 Até Quantidade_de_pontos Fazer Ponto[i].x = Ponto[i].x * Sx Ponto[i].y = Ponto[i].y * Sy Fim para
A operação é executada em todos os pontos do elemento, assim como na operação de translação.
Exemplo
Agora imagine que vamos executar a operação de escala no nosso triângulo original (Figura 1). Considere que vamos executar a operação de escala com os seguintes valores de Sx e Sy respectivamente (0.5, 2). Então teremos que:
Ponto[0].x = Ponto[0].x * Sx = 5 * 0.5 = 2.5 Ponto[0].y = Ponto[0].y * Sy = 10 * 2 = 20 Ponto[0].x = Ponto[0].x * Sx = 10 * 0.5 = 5 Ponto[0].y = Ponto[0].y * Sy = 5 * 2 = 10 Ponto[0].x = Ponto[0].x * Sx = 15 * 0.5 = 7.5 Ponto[0].y = Ponto[0].y * Sy = 10 * 2 = 20
Logo, nossos pontos passarão a ser:
Pontos (2.5, 20), (5, 10) e (7.5, 20)
Gerando uma nova imagem com o elemento Triângulo com sua escala modificada.
|
Neste caso, pegaremos o ponto 0 como pivot do objeto para mostrar o exemplo acima agora usando a operação sobre o pivot.
Sendo assim, nosso algoritmo fica da seguinte forma:
Entrada Sx e Sy Pivot = Ponto[0]; Transladar(-Pivot.x, -Pivot.y); Para i = 0 Até Quantidade_de_pontos Fazer Ponto[i].x = Ponto[i].x * Sx Ponto[i].y = Ponto[i].y * Sy Fim para Transladar(Pivot.x, Pivot.y);
Agora com essa operação de translação usando o pivot negativo, temos os seguintes pontos:
Pontos = (0, 0), (5, -5) e (10, 0)
Só então aplicamos a operação de Escala, resultando os seguintes pontos:
Pontos = (0, 0), (2.5, -10) e (5, 0)
Depois disso então movemos de volta os pontos para o ponto de origem do objeto conforme a localização original do pivot, armazenada anteriormente. Obtemos então os seguintes pontos:
Pontos = (5, 10), (7.5, 0) e (10, 10)
Rotação
|
A operação de rotação ocorre com a multiplicação da matriz de Rotação com todos os pontos do objeto. A matriz de rotação é a seguinte:
| cos(ang) sen(ang) | |-sen(ang) cos(ang) |
tal que:
ang é o ângulo, em radianos, que se quer rotacionar o objeto, sen é a operação do seno sobre o ângulo e cos é a operação do cosseno sobre o ângulo.
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
[ x y ] * | cos(ang) sen(ang) | |-sen(ang) cos(ang) |
tal que:
x' = (x * cos(ang)) + (y * -sen(ang)) y' = (x * sen(ang)) + (y * cos(ang))
|
|
Algoritmo
Baseado na matriz e na fórmula para a operação de escala no plano, o algoritmo para esta operação fica da seguinte maneira:
Entrada ang Pivot = Ponto[0]; Transladar (-Pivot.x, -Pivot.y) Para i = 0 Até Quantidade_de_pontos Fazer xAux = (Ponto[i].x * cos(ang)) + (Ponto[i].y * -sen(ang)) yAux = (Ponto[i].x * sen(ang)) + (Ponto[i].y * cos(ang)) Ponto[i].x = xAux Ponto[i].y = yAux Fim para Transladar (Pivot.x, Pivot.y)
A operação é executada em todos os pontos do elemento, assim como na operação de translação e na escala.