09 - Interpolação em Triângulos¶
Para essa atividade vamos usar o Numpy e Matplotlib. Assim vamos carregar as bibliotecas.
In [43]:
Copied!
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.tri as mtri
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.tri as mtri
Vamos definir algumas funções auxiliares que vão nos ajudar a exibir os gráficos.
In [44]:
Copied!
# Faz o setup para desenhar gráficos
def graph():
fig = plt.figure()
ax = plt.axes()
plt.grid()
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
ax.axhline(0, color='black') # deixa o X do eixo 0 em destaque
ax.axvline(0, color='black') # deixa o Y do eixo 0 em destaque
ax.set_aspect('equal') # Não suportado em todas as plataformas
ax.set(xlabel='x', ylabel='y')
fig.tight_layout()
return ax
# Fonte: https://stackoverflow.com/questions/41596386/tripcolor-using-rgb-values-for-each-vertex
def colors_to_cmap(colors):
colors = np.asarray(colors)
if colors.shape[1] == 3:
colors = np.hstack((colors, np.ones((len(colors),1))))
steps = (0.5 + np.asarray(range(len(colors)-1), dtype=float))/(len(colors) - 1)
return matplotlib.colors.LinearSegmentedColormap(
'auto_cmap',
{clrname: ([(0, col[0], col[0])] +
[(step, c0, c1) for (step,c0,c1) in zip(steps, col[:-1], col[1:])] +
[(1, col[-1], col[-1])])
for (clridx,clrname) in enumerate(['red', 'green', 'blue', 'alpha'])
for col in [colors[:,clridx]]},
N=len(colors))
def draw_triangle(poly, colors):
triangles = np.asarray([[0, 1, 2]])
triang = mtri.Triangulation(poly[0], poly[1], triangles)
cmap = colors_to_cmap(colors)
zs = np.asarray(range(3), dtype=float)/2
plt.tripcolor(triang, zs, cmap=cmap, shading='gouraud' )
plt.grid()
plt.scatter(poly[0], poly[1], s=20, color=colors)
# Faz o setup para desenhar gráficos
def graph():
fig = plt.figure()
ax = plt.axes()
plt.grid()
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
ax.axhline(0, color='black') # deixa o X do eixo 0 em destaque
ax.axvline(0, color='black') # deixa o Y do eixo 0 em destaque
ax.set_aspect('equal') # Não suportado em todas as plataformas
ax.set(xlabel='x', ylabel='y')
fig.tight_layout()
return ax
# Fonte: https://stackoverflow.com/questions/41596386/tripcolor-using-rgb-values-for-each-vertex
def colors_to_cmap(colors):
colors = np.asarray(colors)
if colors.shape[1] == 3:
colors = np.hstack((colors, np.ones((len(colors),1))))
steps = (0.5 + np.asarray(range(len(colors)-1), dtype=float))/(len(colors) - 1)
return matplotlib.colors.LinearSegmentedColormap(
'auto_cmap',
{clrname: ([(0, col[0], col[0])] +
[(step, c0, c1) for (step,c0,c1) in zip(steps, col[:-1], col[1:])] +
[(1, col[-1], col[-1])])
for (clridx,clrname) in enumerate(['red', 'green', 'blue', 'alpha'])
for col in [colors[:,clridx]]},
N=len(colors))
def draw_triangle(poly, colors):
triangles = np.asarray([[0, 1, 2]])
triang = mtri.Triangulation(poly[0], poly[1], triangles)
cmap = colors_to_cmap(colors)
zs = np.asarray(range(3), dtype=float)/2
plt.tripcolor(triang, zs, cmap=cmap, shading='gouraud' )
plt.grid()
plt.scatter(poly[0], poly[1], s=20, color=colors)
O código abaixo desenha um triangulo com cores por vértice. Identifique as cores dos 3 pontos de teste (variável prob) usando coordenadas baricêntricas.
In [47]:
Copied!
ax = graph() # configura o espaço para desenhar um gráfico 2D
# Vértices do triângulo
poly = np.array([[ -2.0, 2.0, 0.0],
[ -2.0, -2.0, 1.0]])
# Cores definidas para cada vértice do triângulo
colors = np.asarray( [[1.0,0.0,0.0],
[0.0,1.0,0.0],
[0.0,0.0,1.0]] )
# Desenho do triângulo
draw_triangle(poly, colors) # Desenha triângulo colorido
# Pontos de teste
prob = np.array([[ -1.5, 1.5, 0.0],
[ -1.5, -1.5, 0.5]])
plt.scatter(prob[0], prob[1], s=20, marker="*", color="black")
plt.show()
ax = graph() # configura o espaço para desenhar um gráfico 2D
# Vértices do triângulo
poly = np.array([[ -2.0, 2.0, 0.0],
[ -2.0, -2.0, 1.0]])
# Cores definidas para cada vértice do triângulo
colors = np.asarray( [[1.0,0.0,0.0],
[0.0,1.0,0.0],
[0.0,0.0,1.0]] )
# Desenho do triângulo
draw_triangle(poly, colors) # Desenha triângulo colorido
# Pontos de teste
prob = np.array([[ -1.5, 1.5, 0.0],
[ -1.5, -1.5, 0.5]])
plt.scatter(prob[0], prob[1], s=20, marker="*", color="black")
plt.show()