-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlabE.py
72 lines (56 loc) · 3.43 KB
/
labE.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# Higor Martinez Oliveira
import math
import numpy as np
#Exercício 1
def calcularAngulo(x,y):
"""Funcao que retorna o angulo em graus dado o valor de seno e cosseno"""
if x**2 + y**2 == 1:
angulo = math.acos(y)
if x < 0:
anguloGraus = math.degrees(angulo-(2*angulo))
return anguloGraus
else:
anguloGraus = math.degrees(angulo)
return anguloGraus
else:
return None
#Exercício 2
def analisarIsometria(matriz):
"""Funcao que analisa se uma transformacao é uma isometria"""
vetorTranslacao = matriz[:,2]
submatrizA = np.array([[matriz[0,0], matriz[0,1]], [matriz[1,0], matriz[1,1]]])
matrizIdentidade = np.identity(2)
R = np.array([[1,0], [0,-1]])
if np.allclose(np.transpose(submatrizA)@submatrizA, matrizIdentidade) == False:
return "A transformacao não é uma isometria"
else:
if np.linalg.det(submatrizA) < 0: #há reflexao
matrizRot = submatrizA@np.transpose(R)
anguloRot = calcularAngulo(matrizRot[1,0], matrizRot[0,0])
if anguloRot != 0 and np.allclose(np.zeros(2), vetorTranslacao) == False: #rotacao != 0 com translacao
return "A transformacao é uma isometria composta de reflexão pelo eixo x, rotação pelo ângulo {} graus, translação pelo vetor {}".format(anguloRot, vetorTranslacao)
elif anguloRot != 0 and np.allclose(np.zeros(2), vetorTranslacao) == True: #rotacao != 0 sem translacao
return "A transformacao é uma isometria composta de reflexão pelo eixo x, rotação pelo ângulo {} graus".format(anguloRot)
elif anguloRot == 0 and np.allclose(np.zeros(2), vetorTranslacao) == False: #rotacao == 0 com translacao
return "A transformacao é uma isometria composta de reflexão pelo eixo x, translação pelo vetor {}".format(vetorTranslacao)
elif anguloRot == 0 and np.allclose(np.zeros(2), vetorTranslacao) == True: #rotacao == 0 sem translacao
return "A transformacao é uma isometria composta de reflexão pelo eixo x"
if np.linalg.det(submatrizA) > 0: #sem reflexao
anguloRot = calcularAngulo(submatrizA[1,0], submatrizA[0,0])
if anguloRot != 0 and np.allclose(np.zeros(2), vetorTranslacao) == False: #rotacao !=0 com translacao
return "A transformacao é uma isometria composta de rotação pelo ângulo {} graus, translação pelo vetor {}".format(anguloRot, vetorTranslacao)
elif anguloRot != 0 and np.allclose(np.zeros(2), vetorTranslacao) == True: #rotacao != 0 sem translacao
return "A transformacao é uma isometria composta de rotação pelo ângulo {} graus".format(anguloRot)
elif anguloRot == 0 and np.allclose(np.zeros(2), vetorTranslacao) == False: #rotacao == 0 com translacao
return "A transformacao é uma isometria composta de translação pelo vetor {}".format(vetorTranslacao)
#Exercício 3
def comporIsometria(angulo, b = np.array([0,0]) , reflexao = False):
"""Funcao que compoe uma isometria dado o angulo, vetor de translação e condicao de reflexão"""
A = np.array([[math.cos(angulo), -math.sin(angulo)], [math.sin(angulo), math.cos(angulo)]])
Rx = np.array([[1,0],[0,-1]])
if reflexao == False:
matrizAb = np.column_stack((A, b))
elif reflexao == True:
A = A@Rx
matrizAb = np.column_stack((A, b))
return matrizAb