Versión en Español · English Version
Curvana es una plataforma educativa y de simulación científica orientada a la visualización rigurosa e interactiva de parametrizaciones de curvas, geometría diferencial clásica e integrales de línea de campos tanto escalares como vectoriales. Concebida como una herramienta pedagógica para la enseñanza de Cálculo Multivariable (particularmente en cursos universitarios de ingeniería y ciencias físicas), la herramienta permite a estudiantes y docentes analizar de forma dinámica la interconexión entre la descripción algebraica de una curva, sus propiedades geométricas intrínsecas y el comportamiento de campos físicos o matemáticos definidos sobre su trayectoria.
- Fundamentos Matemáticos Implementados
- Arquitectura de Software y Módulos
- Características y Modos de Entrada
- Optimización de Rendimiento y Algoritmos
- Verificación Científica y Suite de Pruebas
- Guía de Configuración y Desarrollo
- Compilación y Distribución
- Licencia y Citas
La aplicación ejecuta cálculos numéricos y simbólicos en tiempo real basados en los siguientes modelos teóricos de la geometría diferencial y el análisis multivariable:
Una curva
Para cada instante del parámetro
-
Vector Tangente Unitario (
$\mathbf{T}$ ): Señala la dirección instantánea del movimiento.$$\mathbf{T}(t) = \frac{\mathbf{r}'(t)}{|\mathbf{r}'(t)|}$$ -
Vector Normal Unitario (
$\mathbf{N}$ ): Apunta hacia el centro de curvatura de la trayectoria.$$\mathbf{N}(t) = \frac{\mathbf{T}'(t)}{|\mathbf{T}'(t)|}$$ -
Vector Binormal Unitario (
$\mathbf{B}$ ): Define el plano osculador junto con$\mathbf{T}$ .$$\mathbf{B}(t) = \mathbf{T}(t) \times \mathbf{N}(t)$$ -
Curvatura (
$\kappa$ ): Cuantifica qué tan rápido la curva cambia de dirección respecto a su longitud de arco.$$\kappa(t) = \frac{|\mathbf{r}'(t) \times \mathbf{r}''(t)|}{|\mathbf{r}'(t)|^3}$$ -
Longitud de Arco (
$s$ ): Distancia acumulada recorrida a lo largo de la curva desde el límite inferior:$$s(t) = \int_{t_{\min}}^{t} |\mathbf{r}'(\tau)| , d\tau$$
-
Sobre un Campo Escalar
$f(x, y, z)$ : Representa magnitudes acumuladas como la masa de un filamento con densidad variable.$$\int_{C} f , ds = \int_{t_{\min}}^{t_{\max}} f(\mathbf{r}(t)) |\mathbf{r}'(t)| , dt$$ -
Sobre un Campo Vectorial
$\mathbf{F}(x, y, z)$ : Cuantifica el trabajo físico realizado por una fuerza a lo largo de la trayectoria.$$\int_{C} \mathbf{F} \cdot d\mathbf{r} = \int_{t_{\min}}^{t_{\max}} \mathbf{F}(\mathbf{r}(t)) \cdot \mathbf{r}'(t) , dt$$
El proyecto sigue una estricta separación de responsabilidades a través de una arquitectura desacoplada basada en capas. Esto garantiza la testabilidad y el mantenimiento del motor matemático central sin dependencias de la interfaz de usuario o las tecnologías de renderizado.
src/
core/ # Capa Matemática Pura (sin DOM, independiente de Three.js)
vector # Operaciones vectoriales tridimensionales de bajo nivel
parser # Validador sintáctico y compilador de expresiones con math.js
curve # Representación y muestreo de funciones vectoriales
differential # Derivación numérica, triedro de Frenet y curvatura
fields # Definición de campos matemáticos e integrales de línea
interpolator # Rejillas de precomputación e interpolación lineal O(1)
cartesian # Reconocimiento algebraico y parametrización automática
state # Modelado de estado interno y serialización de URL
render/ # Motor Gráfico WebGL (con Three.js)
scene # Inicialización y administración del Viewport 3D
curveMesh # Renderizado de trayectorias con soporte para discontinuidades
frame # Representación visual del triedro de Frenet-Serret
fieldViz # Visualización espacial de campos vectoriales mediante flechas
ui/ # Interfaz de Usuario y DOM (Vainilla CSS y HTML5)
controlPanel # Formularios de entrada paramétrica, cartesiana y biblioteca
componentPlots # Gráficos 2D de coordenadas x(t), y(t), z(t) en canvas
transportBar # Controladores de reproducción temporal, slider y velocidad
equationView # Renderizado matemático interactivo con KaTeX
services/ocr # Módulo de Reconocimiento Óptico de Caracteres
OcrProvider # Proveedor abstracto y normalizador de texto OCR
TesseractProvider # Integración directa con el motor Tesseract.js
app.ts # Orquestador del ciclo de vida global de la aplicación
La regla fundamental de dependencia es jerárquica y unidireccional: las capas ui/ y render/ dependen directamente de core/, pero la capa core/ no tiene conocimiento alguno de la interfaz gráfica, lo que facilita su ejecución y prueba en entornos headless (como Node.js o suites de CI).
Curvana ofrece un flujo de trabajo altamente versátil a través de tres modos de interacción matemática (modelo de entrada híbrido):
Acceso inmediato a trayectorias paramétricas clásicas útiles para analizar propiedades físicas o geométricas. Incluye: rectas segmentadas, circunferencias, elipses, parábolas parabólicas, hélices cilíndricas tridimensionales, espirales logarítmicas, curvas de Lissajous, espirales cónicas y la Curva de Viviani (intersección entre una esfera y un cilindro tangente).
Permite al usuario ingresar una ecuación algebraica convencional para que el sistema deduzca e implemente automáticamente su parametrización equivalente en 2D o 3D:
- Reconoce rectas en el plano (
$ax + by = c$ ). - Proyecta funciones explícitas del tipo
$y = f(x)$ usando la parametrización natural$\mathbf{r}(t) = (t, f(t))$ . - Resuelve cónicas generales como circunferencias (
$x^2 + y^2 = R^2$ ) y elipses ($x^2/a^2 + y^2/b^2 = 1$ ). - Identifica de forma simbólica intersecciones espaciales complejas en 3D, tales como cilindros coplanares en los planos proyectivos
$xy$ ,$yz$ o$xz$ intersectados con planos oblicuos (por ejemplo, el sistema de ecuaciones cartesianas$x^2 + z^2 = 9, y = 2x + 1$ ).
Permite escribir fórmulas personalizadas para las funciones coordenadas math.js, definiendo el intervalo continuo
Soporta la carga directa o captura fotográfica de ecuaciones algebraicas y paramétricas. Mediante un proveedor OCR basado en Tesseract.js en el navegador, extrae el texto, filtra el ruido sintáctico, normaliza la notación y carga la parametrización resultante directamente en la aplicación.
Con el objetivo de garantizar animaciones a 60 fotogramas por segundo (FPS) sin provocar sobrecarga de cómputo en la CPU ni problemas de basura en memoria (garbage collection), el sistema implementa mecanismos avanzados de precomputación e interpolación:
En lugar de evaluar la regla de integración numérica de Simpson sobre toda la longitud recorrida en cada ciclo del bucle de animación (operación que se volvería más costosa a medida que
- Se divide el intervalo total en una rejilla homogénea de 400 subintervalos.
- Se evalúa de antemano el valor acumulado de la longitud de arco
$s(t)$ y de las integrales de línea escalar y vectorial para cada uno de los nodos de la rejilla. - Durante el ciclo de animación en tiempo real, el valor de la integral para cualquier parámetro arbitrario
$t$ se aproxima en tiempo constante$O(1)$ realizando una interpolación lineal entre los dos nodos más cercanos de la rejilla.
El módulo componentPlots.ts utiliza un observador de cambios de tamaño (ResizeObserver) para actualizar las dimensiones de los lienzos canvas HTML5 únicamente en respuesta a eventos de redimensionamiento de ventana. Esto evita invocar métodos costosos como getBoundingClientRect() o actualizar estilos geométricos dentro de los ciclos de dibujo iterativos, suprimiendo las advertencias de rendimiento del navegador.
El compilador de expresiones de parser.ts analiza la sintaxis matemática mediante la construcción del árbol sintáctico abstracto (AST) con math.parse. En lugar de evaluar la función en puntos aleatorios para verificar su validez, el sistema recorre el árbol de nodos de forma estática garantizando que:
- Todos los identificadores correspondan a variables permitidas (por ejemplo,
$t$ en curvas paramétricas, o bien$x, y, z$ en campos) o a constantes y funciones legítimas demath.js. - No existan operadores binarios mal formados o consecutivos.
- No se introduzcan métodos de prototipo u objetos no numéricos que comprometan la seguridad de la ejecución.
El sistema incluye una amplia cobertura de pruebas unitarias y de integración desarrolladas bajo la suite Vitest. Las pruebas garantizan la correctitud de los cálculos comparándolos con soluciones analíticas clásicas de la física y las matemáticas multivariables:
-
Ortonormalidad del Triedro Móvil: Comprobación de que para toda curva regular evaluada, los vectores
$\mathbf{T}$ ,$\mathbf{N}$ y$\mathbf{B}$ tienen magnitud unitaria y son mutuamente ortogonales en todo instante ($\mathbf{T} \cdot \mathbf{N} = 0$ ,$\mathbf{T} \cdot \mathbf{B} = 0$ ,$|\mathbf{B}| = 1$ ). -
Curvatura Analítica: Validación matemática del cálculo numérico contra valores teóricos conocidos, como la curvatura constante de un círculo de radio
$R$ ($\kappa = 1/R$ ) y de una hélice regular. -
Teoremas de Integración (Campos Conservativos): Verificación de que la integral de línea de un campo vectorial conservativo
$\mathbf{F} = \nabla \phi$ sobre una curva depende exclusivamente de los puntos de frontera, cumpliendo el Teorema Fundamental del Cálculo para Integrales de Línea:$$\int_{C} \nabla \phi \cdot d\mathbf{r} = \phi(\mathbf{r}(t_{\max})) - \phi(\mathbf{r}(t_{\min}))$$ -
Aplicación del Teorema de Green: Comprobación en curvas planas cerradas de que la integral de línea del campo vectorial
$\mathbf{F} = (-y, x)$ corresponde exactamente a dos veces el área delimitada por la elipse o círculo parametrizado. -
Robustez ante Singularidades: Comprobación de que trayectorias con asíntotas o coordenadas no finitas (como
$y = 1/t$ en entornos que contienen al cero) son aisladas correctamente por el renderizadorcurveMesh.ts, evitando el trazado erróneo de segmentos dirigidos hacia el origen$(0,0,0)$ .
- Node.js versión 20.0.0 o superior.
- Administrador de paquetes npm (incluido con Node.js).
Clone el repositorio en su máquina local y acceda a la carpeta raíz del proyecto para descargar los paquetes requeridos:
git clone https://github.com/kegouro/curvana.git
cd curvana
npm installPara levantar el servidor de desarrollo local interactivo con Vite:
npm run devLa aplicación estará disponible en la dirección local indicada por la terminal, por defecto: http://localhost:5173.
Para ejecutar el banco de pruebas completo una sola vez:
npm run testPara activar el modo de observación continua (watch mode) de las pruebas durante el desarrollo:
npm run test:watchPara generar los archivos optimizados listos para su distribución y alojamiento en la web:
npm run buildEste comando ejecuta la comprobación de tipos de TypeScript y compila el bundle estático en la carpeta dist/.
Curvana se puede distribuir de manera nativa en sistemas operativos de escritorio.
Para ejecutar la aplicación en el entorno Electron de desarrollo local:
npm run appPara generar los instaladores empaquetados específicos para su plataforma local (los archivos compilados se almacenarán en el directorio release/):
npm run distAdicionalmente, se disponen de scripts dedicados por plataforma:
- macOS (DMG y ZIP):
npm run dist:mac - Windows (Instalador NSIS y Portable):
npm run dist:win - Linux (AppImage y paquete DEB):
npm run dist:linux
Los flujos de integración continua del repositorio ejecutan compilaciones cruzadas en servidores nativos de GitHub Actions al crear etiquetas de lanzamiento (tags que coincidan con el patrón v*), publicando automáticamente los binarios generados en las versiones de lanzamiento (Releases) del repositorio.
Este software se distribuye bajo los términos de la Licencia de Código Abierto MIT. El código fuente es de libre acceso, modificación y distribución comercial o académica bajo los términos descritos en el archivo LICENSE.
El proyecto cuenta con registro en Zenodo para su citación formal en investigaciones científicas u obras educativas. Puede consultar el identificador de objeto digital (DOI) y el archivo de especificación en formato CITATION.cff para obtener los metadatos de referencia en BibTeX o RIS.
Curvana forma parte del Proyecto Pharos, un esfuerzo tecnológico orientado al desarrollo de infraestructura científica y educativa sin barreras de entrada para estudiantes y científicos a nivel global. · Diseñado e implementado por José Labarca Baeza.
