import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

fig = plt.figure(figsize=(16, 10), dpi=300)
ax = fig.add_subplot(111, projection='3d')

# Parametrização 3D da superfície do casco (8,50 m x 2,90 m)
# x: comprimento de 0 (popa) a 8.5 m (proa)
# v: parâmetro de seção do fundo (quilha) até a borda (convés) de 0 a 1

x = np.linspace(0, 8.5, 90)
v = np.linspace(0, 1, 45)
X, V = np.meshgrid(x, v)

# Linha de borda (Sheerline)
sheer = 0.80 + 0.55 * (X / 8.5)**2.3

# Linha de quilha (Fundo)
keel = np.where(X < 5.5, -0.65 - 0.10 * np.exp(-((X - 1.2)/1.0)**2), -0.65 + 2.0 * ((X - 5.5)/3.0)**2)

# Semi-boca máxima em função de x
max_half_b = np.where(X < 4.5, 1.20 + 0.25 * (X/4.5)**1.5, 1.45 * np.sqrt(np.maximum(0, 1 - ((X - 4.5)/4.0)**2)))

# Superfície Y (Boreste / Bombordo)
# Formato em V suave com bojo redondo
Y_be = max_half_b * np.power(V, 0.45) * (1 - 0.15 * (1 - V) * np.exp(-X/3.0))
Y_bb = - Y_be

# Superfície Z (Altura)
Z = keel + V * (sheer - keel)

# Cores: Azul Marinho para costado e Vermelho Óxido para fundo vivo (abaixo da WL = 0)
# Superfície de Boreste
colors_be = np.where(Z < 0, '#B91C1C', '#1E3A8A')
surf_be = ax.plot_surface(X, Y_be, Z, facecolors=colors_be, alpha=0.92, edgecolor='#0F172A', lw=0.2, shade=True)

# Superfície de Bombordo
colors_bb = np.where(Z < 0, '#B91C1C', '#1E3A8A')
surf_bb = ax.plot_surface(X, Y_bb, Z, facecolors=colors_bb, alpha=0.92, edgecolor='#0F172A', lw=0.2, shade=True)

# Espelho de Popa 3D (x = 0)
v_transom = np.linspace(0, 1, 30)
w_transom = 1.20 * np.power(v_transom, 0.45)
z_transom = -0.65 + v_transom * (0.80 - (-0.65))
Y_tr_grid, Z_tr_grid = np.meshgrid(np.linspace(-1.2, 1.2, 30), z_transom)
X_tr = np.zeros_like(Y_tr_grid)
# Fechamento simples de popa
ax.plot_surface(np.zeros((2, 30)), np.vstack([-w_transom, w_transom]), np.vstack([z_transom, z_transom]), color='#1E293B', alpha=0.95)

# Linha d'Água 3D (Plano translúcido em Z = 0)
x_wl = np.linspace(-0.5, 9.0, 30)
y_wl = np.linspace(-2.0, 2.0, 30)
X_wl, Y_wl = np.meshgrid(x_wl, y_wl)
Z_wl = np.zeros_like(X_wl)
ax.plot_surface(X_wl, Y_wl, Z_wl, color='#38BDF8', alpha=0.25)

# Verdugo de madeira na borda (Linhas 3D)
v_top_idx = -1
ax.plot(X[v_top_idx, :], Y_be[v_top_idx, :], Z[v_top_idx, :], color='#D97706', lw=3.5, label="Verdugo / Linha de Borda")
ax.plot(X[v_top_idx, :], Y_bb[v_top_idx, :], Z[v_top_idx, :], color='#D97706', lw=3.5)

# Linha de Quilha Central (Fundo)
v_bot_idx = 0
ax.plot(X[v_bot_idx, :], np.zeros_like(X[v_bot_idx, :]), Z[v_bot_idx, :], color='#0F172A', lw=4, label="Quilha / Skeg Maciço")

# Roda de Proa
ax.plot([8.5, 8.5], [0, 0], [Z[v_bot_idx, -1], Z[v_top_idx, -1]], color='#0F172A', lw=3.5)

# Configurações de visualização da câmera 3D (Perspectiva Isométrica Naval)
ax.view_init(elev=22, azim=-55)
ax.set_title("MODELO TRIDIMENSIONAL (3D) DO CASCO — LOBSTER BOAT 8,50 m × 2,90 m\nProa Lançada de Entrada Fina, Costado Azul Naval e Carena Vermelha com Quilha Corrida", fontsize=11, fontweight='bold', color='#0F172A', pad=15)

ax.set_xlabel('Comprimento X (m)', fontsize=8, fontweight='bold')
ax.set_ylabel('Boca Y (m)', fontsize=8, fontweight='bold')
ax.set_zlabel('Altura Z (m)', fontsize=8, fontweight='bold')

ax.set_xlim(-0.5, 9.5)
ax.set_ylim(-2.2, 2.2)
ax.set_zlim(-1.2, 2.0)

plt.tight_layout()
output_3d = "/home/magdalena/eee/alunos/alberico-de-carvalho-santiago/modelo_3d_casco_8_5m.png"
plt.savefig(output_3d, dpi=300, bbox_inches='tight')
plt.close()
print("Modelo 3D gerado com sucesso!")
