No Python, faça uma figura com um carinha com um círuclo, um círculo menor para o olho, um meio círculo para a boca e um x para o outro olho.
a-) Faça a translação desta carinha para ela fique toda no primeiro quadrante.
b-) Faça a reflexão da carinha em relação ao eixo y.
c-) Faça a rotação da carinha em relação ao eixo por 45^{\circ} usando a matriz de rotação.
d-) Faça o cisalhamento da carinha em relação ao eixo x positivo, com um fator de cisalhamento de 0,25.
Passo 1
O enunciado pede para desenharmos em Python, usando Matplotlib e NumPy, uma “carinha” composta por:
um círculo para o rosto;
um círculo menor para um dos olhos;
um semicírculo para a boca;
um “X” para o outro olho.
Depois devemos aplicar as seguintes transformações geométricas a esse conjunto de pontos:
a) translação para que toda a carinha fique no primeiro quadrante;
b) reflexão em relação ao eixo y;
c) rotação de 45^\circ usando matriz de rotação;
d) cisalhamento no eixo x com fator 0,25.
Passo 2
Definimos primeiro as coordenadas da carinha original como arrays NumPy de forma (N,2). Para o círculo (rosto) e o olho usamos parametrização angular, para o semicírculo da boca escolhemos o intervalo de ângulos adequado, e para o “X” do outro olho usamos duas linhas diagonais cruzadas.
Passo 3
Para a translação, calculamos o mínimo de x e de y entre todos os pontos da carinha original e subtraímos esse valor (com um pequeno padding) de todas as coordenadas, garantindo que os valores fiquem positivos e, assim, toda a carinha fique no primeiro quadrante.
Passo 4
Para a reflexão em relação ao eixo y, basta multiplicar a coordenada x de cada ponto por -1, deixando y inalterado.
Passo 5
Para a rotação de 45^\circ, usamos a matriz
R = \begin{pmatrix} \cos(45^\circ) & -\sin(45^\circ)\\\ \sin(45^\circ) & \cos(45^\circ) \end{pmatrix}
e multiplicamos cada ponto por R.
Passo 6
Para o cisalhamento no eixo x com fator k=0,25, usamos a matriz
S = \begin{pmatrix} 1 & k\\\\ 0 & 1 \end{pmatrix}
e multiplicamos cada ponto por S.
Resposta
import numpy as np
import matplotlib.pyplot as plt
# Função para gerar círculo ou semicírculodef \(param_circle\)(center, radius, \(ang_start\), \(ang_end\), n\(=100\)):
theta \(=\) np.linspace(\(ang_start\), \(ang_end\), n)
x \(=\) center[\(0\)] \(+\) radius * np.cos(theta)
y \(=\) center[\(1\)] \(+\) radius * np.sin(theta)
return np.vstack((x, y)).T
# \(1\)) Carinha original
shapes \(=\) []
# Rosto: círculo unitário centrado na origem
shapes.append(\(param_circle\)((\(0,0\)), \(1.0\), \(0\), \(2\)*np.pi))
# Olho esquerdo: círculo menor
shapes.append(\(param_circle\)((-\(0.3\), \(0.3\)), \(0.1\), \(0\), \(2\)*np.pi))
# Boca: semicírculo inferior
shapes.append(\(param_circle\)((\(0\), -\(0.2\)), \(0.5\), np.pi, \(2\)*np.pi))
# Olho direito em X: duas linhas cruzadas
\(eye_center =\) np.array((\(0.3\), \(0.3\)))
d \(=0.1\)
line\(1=\) np.vstack((\(eye_center +\) np.array([-d,-d]), \(eye_center +\) np.array([d,d])))
line\(2=\) np.vstack((\(eye_center +\) np.array([-d,d]), \(eye_center +\) np.array([d,-d])))
shapes.append(line\(1\))
shapes.append(line\(2\))
# Função para aplicar lista de shapes numa matriz de transformaçãodeftransform(shapes, M, \(t=n\)p.zeros(\(2\))):
transformed \(=\) []
for P in shapes:
P\(2=\) (P @ M.T) \(+\) t
transformed.append(P\(2\))
return transformed
# a) Translação para o \(1\)º quadrante
\(all_pts =\) np.vstack(shapes)
\(min_xy = all_pts\).min(axis\(=0\))
padding \(=0.1 t_shift =\) -\(min_xy +\) padding
\(shapes_trans =\) transform(shapes, np.eye(\(2\)), \(t_shift\))
# b) Reflexão no eixo y
\(M_reflect =\) np.array([[-\(1\), \(0\)],
[ \(0\), \(1\)]])
\(shapes_reflect =\) transform(shapes, \(M_reflect\))
# c) Rotação de \(45\) graus
ang \(=\) np.deg\(2\)rad(\(45\))
\(M_rot =\) np.array([[ np.cos(ang), -np.sin(ang)],
[ np.sin(ang), np.cos(ang)]])
\(shapes_rot =\) transform(shapes, \(M_rot\))
# d) Cisalhamento no eixo x com k\(=0,25\)
k \(=0.25 M_shear =\) np.array([[\(1\), k],
[\(0\), \(1\)]])
\(shapes_shear =\) transform(shapes, \(M_shear\))
# Plotando em \(2\)x\(2\) subplots
fig, axes \(=\) plt.subplots(\(2\), \(2\), figsize\(=\)(\(10,10\)))
titles \(=\) ["(a) Translação p/ \(1\)º quadrante",
"(b) Reflexão eixo y",
"\text{(c)} Rotação \(45\circ\)",
"(d) Cisalhamento k\(=0,25\)"]
\(all_shapes =\) [\(shapes_trans\), \(shapes_reflect\), \(shapes_rot\), \(shapes_shear\)]
for ax, shp, title inzip(axes.flat, \(all_shapes\), titles):
for P in shp:
ax.plot(P[:,\(0\)], P[:,\(1\)], 'k')
ax.\(set_aspect\)('equal', 'box')
ax.\(set_title\)(title)
ax.grid(True)
plt.\(tight_layout\)()
plt.show()