Baixe o app para aproveitar ainda mais
Prévia do material em texto
Computação II Laboratório 7 Entregue todos os métodos em um arquivo chamado lab7.py. Critérios de avaliação: Principalmente (75%) o código funciona, os métodos fazem o que foi pedido, parâmetros de entrada e valores de retorno são corretos e em forma correta. Adicionalmente (25%) o código é legível, eficaz, o mais simples possível. Daqui para adiante np significa numpy – a biblioteca a ser usada nesta lista, portanto: import numpy as np. 1. (2 pontos) Cria a função chamada calcularAngulo cujo valor de entrada são dois números reais x e y. Se x2 + y2 = 1, considere que x representa o seno de um ângulo e y o cosseno do ângulo, calcule e retorne esse ângulo em graus. Retorne None no caso oposto. Pode usar math.acos mas cuidado que cos(α) = cos(−α). 2. (5 pontos) Isometria é uma transformação geométrica que mantém as distâncias entre os pontos e as amplitudes de ângulos. No plano, qualquer isometria pode ser composta de uma reflexão em torno do eixo x, uma rotação sobre a origem de coordenadas e uma translação por um vector. Uma isometria é formalmente definida como transformação T de um ponto ou de um vector X tal que: T (X) = AX + b, onde A é uma matriz ortogonal (i.e., A>A = I) e b é um vector de translação. Como A é ortogonal, o determinante dela é ±1. Se o determinante for 1, não há reflexão na transformação e a matriz A representa uma rotação sobre a origem por um ângulo α, ou seja: A = ( cos(α) − sin(α) sin(α) cos(α) ) . Se o determinante for -1, a matriz A é uma multiplicação de matrizes: A = ( cos(α) − sin(α) sin(α) cos(α) ) ·Rx, onde Rx = ( 1 0 0 −1 ) é a reflexão em torno do eixo x. Portanto uma isometria é unicamente determinada por uma matriz aumentada Ab Ab = ( A[0, 0] A[0, 1] b[0] A[1, 0] A[1, 1] b[1] ) . Implemente a função analisarIsometria que recebe uma matriz aumentada Ab (np.ndarray). A função deve analisar a transformação representada pela Ab e retornar uma string com a conclusão da análise como nos exemplos abaixo: >>> psi = np.pi/3 >>> A = np.array([[math.cos(psi), - math.sin(psi)],[math.sin(psi), math.cos(psi)]]) >>> b = np.zeros(2) >>> Ab = np.column_stack((A,b)) >>> analisarIsometria(Ab) ’A transformacao é uma isometria composta de rotação pelo ângulo 60.00 grauss, ’ >>> reflexao = np.array([[1,0],[0,-1]]) >>> AR = A@reflexao >>> Ab = np.column_stack((AR,b)) >>> analisarIsometria(Ab) ’A transformacao é uma isometria composta de reflexão pelo eixo x, rotação pelo ângulo 60.00 grauss, ’ >>> b = np.array([2,-1]) >>> Ab = np.column_stack((np.zeros((2,2)),b)) >>> analisarIsometria(Ab) 1 ’A transformacao não é uma isometria.’ >>> Ab = np.column_stack((np.identity((2)),b)) >>> analisarIsometria(Ab) ’A transformacao é uma isometria composta de translação pelo vetor [ 2. -1.], ’ Dicas: • Se A não for ortogonal, a transformação não é uma isometria – nesse caso retorne uma string dizendo que a transformação não é uma isometria. O método np.allclose(G,H) retorna True se G for igual a H e retorna False no caso oposto. O método np.transpose retorna a matriz transposta. • Pode usar o método np.linalg.det para calcular o determinante de matriz A e descobrir se há uma reflexão na transformação. • Sabemos que RxRx = I, i.e., a reflexão em torno do eixo x aplicada duas vezes resulta em identidade. Portanto, se tiver a reflexão Rx na transformação, a matriz de rotação será igual a ARxRx. • Encontre o ângulo α da rotação a partir dos elementos da matriz de rotação usando o método calcularAngulo. 3. (3 pontos) Implemente o método chamado comporIsometria com três parâmetros de entrada: um número representando um ângulo (em radianos), um np.ndarray representando um vetor de translação em R2 cujo valor default é um vetor de zeros, e um valor booleano cujo valor default é False que indica se há reflexão em torno de eixo x ou não na isometria a ser composta. A função deve então compor e retornar a matriz aumentada Ab (em formato de np.ndarray) que representa a isometria definida a partir dos valores de entrada – vê também a questão 2 para a teoria de matrizes representando as isometrias. Seguem os exemplos de chamada: >>> theta = np.pi/6 >>> comporIsometria(theta) array([[ 0.8660254, -0.5 , 0. ], [ 0.5 , 0.8660254, 0. ]]) >>> comporIsometria(theta, np.array([1,10])) array([[ 0.8660254, -0.5 , 1. ], [ 0.5 , 0.8660254, 10. ]]) >>> comporIsometria(theta, np.zeros(2), True) array([[ 0.8660254, 0.5 , 0. ], [ 0.5 , -0.8660254, 0. ]]) 2
Compartilhar