Transformações em Imagens Vetoriais no Espaço
Afluentes: Computação Gráfica
Representação
|
O seguinte exemplo apresenta um algoritmo para a representação aramada de um cubo.
Ponto { Real x Real y Real z } Cubo = Vetor [8] Ponto Cubo[0].Ponto = ( 5, 5, 5); Cubo[1].Ponto = (10, 5, 5); Cubo[2].Ponto = (10, 10, 5); Cubo[3].Ponto = ( 5, 10, 5); Cubo[4].Ponto = ( 5, 5, 10); Cubo[5].Ponto = (10, 5, 10); Cubo[6].Ponto = (10, 10, 10); Cubo[7].Ponto = ( 5, 10, 10); j = 1; Para i = 0 até 3 Fazer j = i + 1; Se j == 4 Então j = 0 Fim se Desenhar_linha( Cubo[i].Ponto.x, Cubo[i].Ponto.y, Cubo[i+4].Ponto.x, Cubo[i+4].Ponto.y) Desenhar_linha( Cubo[i].Ponto.x, Cubo[i].Ponto.y, Cubo[j].Ponto.x, Cubo[j].Ponto.y) Desenhar_linha( Cubo[i+4].Ponto.x, Cubo[i+4].Ponto.y, Cubo[j+4].Ponto.x, Cubo[j+4].Ponto.y) Fim para
|
Transformações
As transformações no espaço tridimensional devem ser aplicadas, assim como nas transformações no plano, em todos os pontos do objeto. Aqui são apresentadas as transformações de translação, escala e rotação em x, y e z.
Translação
A operação da translação ocorre com a soma da matriz de translação com todos os pontos do objeto, assim como a translação no espaço. Porém, agora a matriz de translação possui um elemento a mais para tratar do eixo z, o Tz. A matriz de translação no espaço tridimensional é a seguinte:
tal que:
Tx é a translação na horizontal e Ty é a translação na vertical e Tz é a translação em relação à profundidade.
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
tal que:
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, Ty e Tz Para i = 0 Até Quantidade_de_pontos Fazer Ponto[i].x = Ponto[i].x + Tx Ponto[i].y = Ponto[i].y + Ty Ponto[i].z = Ponto[i].z + Tz Fim para
Ou seja, a operação é executada em todos os pontos do elemento.
Escala
A operação da escala ocorre com a multiplicação da matriz de Escala com todos os pontos do objeto, agora com o eixo Z acrescido e o novo elemento Sz (Escala em profundidade). A matriz de escala é a seguinte:
tal que:
Sx : é a modificação da escala na horizontal, Sy : é a modificação da escala na vertical e Sz : é a modificação da escala em relação à profundidade.
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
tal que:
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, Sy e Sz Pivo = Ponto[0]; Transladar(-Pivo.x, -Pivo.y, -Pivo.z); Para i = 0 Até Quantidade_de_pontos Fazer Ponto[i].x = Ponto[i].x * Sx Ponto[i].y = Ponto[i].y * Sy Ponto[i].z = Ponto[i].z * Sz Fim para Transladar(Pivo.x, Pivo.y, Pivo.z);
A operação é executada em todos os pontos do elemento, assim como na operação de translação.
Rotação
A operação de rotação ocorre com a multiplicação da matriz de Rotação com todos os pontos do objeto. Porém, é importante observar que a matriz de rotação agora pode ser aplicada nos eixos x, y e z. No plano, a rotação é considerada sobre o eixo z. Dessa forma, as matrizes de rotação são apresentadas a seguir:
Rotação em z
tal que:
θ é o ângulo, em radianos, que se quer rotacionar o objeto, sin é 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:
tal que:
|
Algoritmo
Baseado na matriz de rotação em z, o algoritmo para esta operação fica da seguinte maneira:
Entrada ang Pivo = Ponto[0]; Transladar (-Pivo.x, -Pivo.y, -Pivo.z) 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 (Pivo.x, Pivo.y, Pivo.z)
|
Aqui, também, operação é executada em todos os pontos do elemento, assim como na operação de translação e na escala.
Rotação em x
Seguindo o esquema da rotação em z, a rotação em x também possui sua matriz de rotação.
Logo, a fórmula matemática da operação de translação em x fica da seguinte forma:
tal que:
|
Algoritmo
Entrada ang Pivo = Ponto[0]; Transladar (-Pivo.x, -Pivo.y, -Pivo.z) Para i = 0 Até Quantidade_de_pontos Fazer yAux = (Ponto[i].y * cos(ang)) + (Ponto[i].z * -sen(ang)) zAux = (Ponto[i].y * sen(ang)) + (Ponto[i].z * cos(ang)) Ponto[i].y = yAux Ponto[i].z = zAux Fim para Transladar (Pivo.x, Pivo.y, Pivo.z)
Rotação em y
Por fim, segue a matriz de rotação em y.
Aplicando a multimplicação de matrizes:
tem-se:
Algoritmo
Entrada ang Pivo = Ponto[0]; Transladar (-Pivo.x, -Pivo.y, -Pivo.z) Para i = 0 Até Quantidade_de_pontos Fazer xAux = (Ponto[i].x * cos(ang)) + (Ponto[i].z * -sen(ang)) zAux = (Ponto[i].x * sen(ang)) + (Ponto[i].z * cos(ang)) Ponto[i].x = xAux Ponto[i].z = zAux Fim para Transladar (Pivo.x, Pivo.y, Pivo.z)