interface WindFlowGrid2DProps { type: string; params: Record; } export function WindFlowGrid2D({ type, params }: WindFlowGrid2DProps) { // Estilo global de animação inserido no próprio SVG const styleBlock = ( ); // Renderizadores específicos de fluxo ativo com base nos sliders da página const renderActiveSimulation = () => { switch (type) { case 'bridge': { const alpha = Number(params.alpha || 0); // O vento muda de ângulo const rotationAngle = alpha * 3; // amplifica o ângulo para ficar visível return (

Simulação Ativa (com suas variáveis)

{styleBlock} {/* Linhas de vento de fundo */} {/* Linhas aceleradas acima e abaixo */} {/* Tabuleiro da ponte */} {/* Barreiras de proteção */} {/* Vetores de Força baseados no ângulo */} {alpha !== 0 && ( {/* Vetor de sustentação (Fz) */} 0 ? "M 200,75 L 200,30" : "M 200,125 L 200,170"} stroke={alpha > 0 ? "#10b981" : "#ef4444"} strokeWidth="3" fill="none" markerEnd="url(#arrow)" /> 0 ? 45 : 160} fill={alpha > 0 ? "#10b981" : "#ef4444"} className="text-xs font-bold font-mono"> {alpha > 0 ? 'Sustentação (+Fz)' : 'Downforce (-Fz)'} )} {/* Marcadores SVG de setas */}
Ângulo: {alpha}º
); } case 'tower': { const section = params.section || 'square'; const alphaWind = Number(params.alphaWind || 0); return (

Simulação Ativa (com suas variáveis)

{styleBlock} {/* Linhas de vento fluindo */} {/* Turbulência traseira (esteira) */} {/* Perfil da Seção da Torre (Centro) */} {section === 'square' ? ( ) : ( )} {/* Barras internas treliçadas */} {section === 'square' ? ( <> ) : ( <> )}
{section === 'square' ? 'Quadrada' : 'Triangular'} | {alphaWind}º
); } case 'cylinder': { const isSmooth = params.roughness === 'smooth' || params.d_over_k > 1e5; return (

Simulação Ativa (com suas variáveis)

{styleBlock} {/* Fluxo contornando cilindro */} {/* Esteira de Vórtices de Von Kármán */} {/* Cilindro */}
Superfície: {isSmooth ? 'Lisa (Menor Arrasto)' : 'Rugosa (Maior Arrasto)'}
); } case 'dynamics': { const fn = Number(params.fn || 0.5); // Frequência regula a velocidade da vibração visual const vibeDuration = Math.max(0.5, Math.min(2.5, 1 / fn)); return (

Simulação Ativa (com suas variáveis)

{styleBlock} {/* Linhas de vento */} {/* Vórtices alternados desalinhados de Von Kármán */} {/* Cilindro que VIBRA verticalmente na ressonância */}
fn: {fn} Hz | Oscilação Ativa
); } default: // Padrão genérico de fluxo para os demais módulos return (

Visualização do Escoamento

{styleBlock} {/* Elemento genérico no centro */}
); } }; // Comparativos estáticos baseados em grids como sugerido pelo usuário const renderComparisonGrid = () => { if (type === 'bridge') { return (
Incidência Descendente (α = -5º)
{styleBlock} {/* Seta para baixo */}

Vento empurra o tabuleiro para baixo, aumentando os esforços de compressão nos pilares.

Incidência Ascendente (α = +5º)
{styleBlock} {/* Seta para cima */}

Efeito aerofólio levanta a ponte. Crítico para pontes estaiadas ou suspensas.

); } if (type === 'tower') { return (
Vento Normal (0º)
{styleBlock}

Vento incidindo perpendicularmente à face frontal. Menor área exposta efetiva.

Vento na Diagonal (45º)
{styleBlock}

Aumenta a esteira e o coeficiente de arrasto Ca nas torres de seção quadrada.

); } // Grid padrão se não houver um caso comparativo customizado return null; }; return (

Túnel de Vento Virtual (Escoamento 2D)

SVG Interativo
{renderActiveSimulation()} {renderComparisonGrid()}
); }