import { useState } from 'react'; import { getDragCoefficient } from '@/lib/drag'; import { useI18n } from '@/store/i18nStore'; import { DragCoefficientChart } from '@/components/DragCoefficientChart'; import { ResizableBox3D } from '@/components/three/ResizableBox3D'; import SceneCanvas from '@/components/SceneCanvas'; import { Environment } from '@react-three/drei'; import { ViewerOrbitControls as OrbitControls } from '@/components/three/ViewerOrbitControls'; import { EducationalManual } from '@/components/EducationalManual'; import { Wind, Box } from 'lucide-react'; import { Slider } from '@/components/ui/slider'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; export default function CalcCaModule() { const i18n = useI18n(); // Apenas chamando caso necessário no ciclo de vida, sem extrair 't' const [l1, setL1] = useState(20); const [l2, setL2] = useState(40); const [h, setH] = useState(10); const [viewMode, setViewMode] = useState<'solid' | 'airflow'>('solid'); // Clamp inputs to avoid Infinity or negative values breaking the UI const safeL1 = Math.max(0.1, l1 || 1); const safeL2 = Math.max(0.1, l2 || 1); const safeH = Math.max(0.1, h || 1); const caLow = getDragCoefficient(safeL1, safeL2, safeH, 'low'); const caHigh = getDragCoefficient(safeL1, safeL2, safeH, 'high'); return (
{/* Coluna Esquerda: Controles */}
Calc_Ca Cálculo rápido de Coeficiente de Arrasto (Ca)
{l1} m
setL1(v[0])} />
{l2} m
setL2(v[0])} />
{h} m
setH(v[0])} />
{/* Coluna Central: 3D */}
} frameloop={viewMode === 'airflow' ? 'always' : 'demand'} >
Arraste para rotacionar, role para aproximar
{/* Coluna Direita: Resultados */}
Resultados (Ca) Valores baseados nas tabelas 4 e 5
Baixa Turbulência {caLow.toFixed(2)}
Alta Turbulência {caHigh.toFixed(2)}
H/L₁ = {(safeH / safeL1).toFixed(2)} L₁/L₂ = {(safeL1 / safeL2).toFixed(2)}
{/* Ábaco */} Ábaco NBR 6123 Curvas isotermas aproximadas
); }