InicioAlgoritmos e IAEnvolvente Convexa

🟦 Envolvente Convexa

Visualizador interactivo de la envolvente convexa: recorre paso a paso Graham scan, Jarvis march y Quickhull con comprobaciones de producto cruzado en vivo y comparación de complejidad.

Algoritmos e IA3DModerado60 FPS
convex-hull ↗ Abrir independiente

Acerca de la Envolvente Convexa

La envolvente convexa de un conjunto de puntos es el polígono convexo más pequeño que los contiene a todos — equivalente a la forma que se obtiene al estirar una goma elástica alrededor de los puntos más externos. Calcular envolventes convexas de forma eficiente es un problema fundamental en geometría computacional con aplicaciones en detección de colisiones (la envolvente convexa de un cuerpo rígido es su volumen delimitador más simple), análisis de formas, búsqueda de caminos y planificación de movimiento de robots. La complejidad temporal óptima en el peor caso es O(n log n) para n puntos de entrada, alcanzable con Graham scan (1972) y varios otros algoritmos; para conjuntos de puntos donde la envolvente tiene h vértices, los algoritmos sensibles a la salida como Jarvis march logran O(nh), lo que es más rápido cuando h es pequeño.

Este simulador implementa y anima tres algoritmos clásicos uno junto a otro. Graham scan ordena todos los puntos por ángulo polar alrededor del punto más bajo, y luego los recorre con una pila, descartando cualquier punto que produzca un giro a la derecha (producto cruzado no izquierdo). Jarvis march (empaquetado de regalo) selecciona repetidamente el punto que forma el ángulo antihorario más pequeño desde el borde actual. Quickhull divide recursivamente el conjunto de puntos usando el punto más alejado por encima de cada arista, de forma similar al paso de partición de quicksort. Puedes hacer clic para añadir puntos, arrastrarlos para reposicionarlos, y recorrer paso a paso cada algoritmo para comparar los estados intermedios y el número de operaciones.

Preguntas Frecuentes

¿Cuál es la complejidad temporal de Graham scan, Jarvis march y Quickhull?

Graham scan se ejecuta en O(n log n) debido a la ordenación angular inicial; el recorrido de la pila es O(n). Jarvis march (empaquetado de regalo) se ejecuta en O(nh), donde h es el número de vértices de la envolvente: en el peor caso (todos los puntos en la envolvente) esto es O(n²), pero para conjuntos de puntos típicos con h = O(log n), es O(n log n). Quickhull tiene un tiempo promedio de O(n log n) (como quicksort) pero O(n²) en el peor caso, cuando todos los puntos están en la envolvente y se procesan individualmente. El algoritmo de Chan (1996) logra el óptimo O(n log h) en todos los casos.

¿Cómo determina la prueba del producto cruzado los giros a la izquierda o a la derecha?

Para tres puntos A, B, C, se calcula el producto cruzado 2D (B − A) × (C − A) = (Bx−Ax)(Cy−Ay) − (By−Ay)(Cx−Ax). Un valor positivo significa que C está a la izquierda de la línea dirigida A→B (giro antihorario), negativo significa a la derecha (horario, que se descarta en Graham scan), y cero significa colineal. Esta prueba de orientación O(1) es la primitiva fundamental en todos los algoritmos de envolvente convexa — y en muchos otros algoritmos de geometría computacional como la triangulación de polígonos y la intersección de segmentos de línea.

¿Cuál es la cota inferior para el cálculo de la envolvente convexa?

El problema de la envolvente convexa tiene una cota inferior de Ω(n log n) en el modelo de árbol de decisión algebraico, probada mediante una reducción desde la ordenación: dados n números x₁, …, xn, se colocan puntos (xᵢ, xᵢ²) sobre una parábola — su envolvente convexa es el conjunto entero, devuelto en orden. Dado que ordenar requiere Ω(n log n) comparaciones, cualquier algoritmo que resuelva ambos problemas también debe tardar Ω(n log n). Esto hace que Graham scan y los algoritmos de fusión de envolventes sean asintóticamente óptimos para conjuntos de puntos generales.

¿Cómo se usa la envolvente convexa en la detección de colisiones?

En la física de juegos 2D, la envolvente convexa de un polígono es su envoltorio convexo mínimo. Dos polígonos convexos pueden probarse para intersección usando el Teorema del Eje Separador (SAT): si existe una línea que separa las dos envolventes, no se solapan — y solo es necesario probar O(h₁ + h₂) ejes separadores candidatos (uno por arista). El algoritmo GJK (Gilbert-Johnson-Keerthi) extiende esto a 3D y maneja objetos curvos calculando la diferencia de Minkowski, logrando O(1) iteraciones en la práctica para formas simples. Tanto SAT como GJK son herramientas fundamentales en Unity, Bullet y otros motores de física.

¿Qué ocurre cuando hay puntos colineales en el borde de la envolvente?

Los puntos que están en una arista de la envolvente pero no son vértices (son colineales entre dos vértices de la envolvente) pueden incluirse o excluirse según la variante del algoritmo. El Graham scan estándar excluye los puntos interiores colineales (los elimina durante el paso de deduplicación de la ordenación), produciendo el conjunto mínimo de vértices. Algunas aplicaciones (por ejemplo, el cálculo del área de un polígono) prefieren incluir todos los puntos del borde. La elección afecta a h (tamaño de la envolvente), al tiempo de ejecución y al comportamiento de la prueba de orientación por producto cruzado (el producto cruzado cero debe manejarse con cuidado para evitar bucles infinitos en Jarvis march).

¿Qué es el algoritmo de Chan y por qué es óptimo?

El algoritmo de Chan (Timothy Chan, 1996) logra un tiempo de O(n log h), donde h es el número de vértices de la envolvente — esto es óptimo porque generar h vértices toma Ω(h) tiempo y ordenar n puntos toma Ω(n log n). El enfoque de Chan estima h en fases de duplicación (probando h = 2, 4, 8, …), ejecutando un mini-Jarvis march que se detiene tras h pasos usando un Graham scan precalculado sobre n/h grupos de puntos como oráculos internos. Cuando la estimación coincide con el verdadero h, el algoritmo termina con una envolvente correcta. Cada fase cuesta O(n log h); la duplicación solo añade un factor constante, dando O(n log h) en total.

¿Cómo se usa la envolvente convexa en programación lineal?

En programación lineal 2D, la región factible definida por m restricciones de desigualdad es un polígono convexo — una envolvente convexa de los puntos de intersección de las restricciones. La solución óptima de un programa lineal siempre se encuentra en un vértice del politopo factible. El método simplex recorre los vértices de este politopo; los métodos de punto interior recorren el interior. En dimensiones más altas (d variables, m restricciones), calcular la enumeración de vértices del politopo factible equivale a calcular una envolvente convexa en d dimensiones — un problema resuelto mediante algoritmos de doble descripción y de beneath-beyond.

¿Qué es la envolvente convexa 3D y qué algoritmos la calculan?

En 3D, la envolvente convexa de n puntos es un poliedro convexo con como máximo O(n) vértices, aristas y caras (por la fórmula de Euler: V − E + F = 2, y para poliedros convexos F ≤ 2n − 4). Los algoritmos incluyen el Graham scan 3D (inserción incremental), divide y vencerás (O(n log n)), y la variante de empaquetado de regalo (Jarvis march en 3D). El algoritmo QuickHull3D de Barber, Dobkin y Huhdanpaa (1996, biblioteca qhull) es el estándar práctico — usado en ConvexHull de SciPy, MATLAB y herramientas de física de motores de juego.

¿Pueden los algoritmos de envolvente convexa manejar puntos duplicados?

Los puntos duplicados (coordenadas idénticas) deben tratarse explícitamente; la mayoría de las implementaciones deduplican la entrada antes de ejecutar el algoritmo de envolvente. En Graham scan, los puntos duplicados producirían productos cruzados de cero, causando ambigüedad en la ordenación angular. En Jarvis march, seleccionar un duplicado como el siguiente vértice de la envolvente podría causar un bucle infinito. Una implementación robusta elimina duplicados en un preprocesamiento de O(n log n), o usa aritmética exacta con perturbación (perturbación simbólica / SOS — simulación de simplicidad) para manejar todas las configuraciones degeneradas de forma consistente.

¿Cuál es la relación entre la envolvente convexa y los diagramas de Voronoi?

Existe una dualidad clásica: el diagrama de Voronoi 2D de n puntos es equivalente a la proyección de la envolvente convexa 3D de los mismos puntos elevados al paraboloide z = x² + y². Concretamente, se eleva cada punto (xᵢ, yᵢ) a (xᵢ, yᵢ, xᵢ² + yᵢ²), se calcula la envolvente convexa 3D, y luego se proyectan las caras de la envolvente inferior de vuelta a 2D — el resultado es la triangulación de Delaunay, y su grafo dual es el diagrama de Voronoi. Esto significa que cualquier algoritmo de envolvente convexa 3D de O(n log n) da inmediatamente un algoritmo de Voronoi de O(n log n), a la altura del clásico algoritmo de barrido de Fortune.

¿Cómo se aplica la envolvente convexa en el aprendizaje automático?

En las máquinas de vectores de soporte (SVM), el clasificador de margen máximo entre dos clases de puntos corresponde a encontrar los puntos más cercanos en las envolventes convexas de las dos clases — la dual de la "bola envolvente mínima". Los vectores de soporte de la SVM son exactamente los puntos de la envolvente más cercanos al hiperplano separador. Las envolventes convexas también aparecen en la profundidad de datos (profundidad de Tukey, el algoritmo de "pelado de cebolla"), la detección de anomalías (los puntos de datos fuera de la envolvente son valores atípicos), y en la optimización multiobjetivo, donde la frontera de Pareto es una porción de la envolvente convexa de los vectores objetivo factibles.

⚙ Bajo el capó

Calcula el polígono convexo más pequeño que encierra un conjunto de puntos con Graham scan, Jarvis march o Quickhull — animado paso a paso, con detección de giros por producto cruzado en vivo y comparación del número de operaciones.

Canvas 2DComputational GeometryConvex HullGraham ScanQuickhull

3D · Renderizador Three.js / WebGL · objetivo 60 FPS · funciona totalmente en el cliente, sin instalación

¿Qué encontraste?

Agregar pasos de reproducción (opcional)