earstrip es un reemplazo directo de earcut para la triangulación de polígonos en WebGL. En nuestra prueba fue unas 6 veces más rápido con polígonos con miles de huecos, y dibujó mucho mejor los polígonos rotos. Con polígonos de mapa comunes, en x86, la ventaja fue de apenas 1,1–1,2 veces, lejos de las cifras que el autor midió en Apple silicon.
yoDEV Tested · 23 de octubre de 2026
Corrimos earstrip 0.2.0 contra earcut 3.2.4 (npm) y earcut.hpp 3.2.4 (C++) sobre los 5,7 millones de polígonos de OpenStreetMap que publica el autor, en una VM x86 con Intel Xeon, Node 22, 24 y 26, GCC 13 y Clang 18. Los resultados que reportamos como nuestros salen de esa prueba.
¿Qué es la triangulación de polígonos y para qué sirven earcut y earstrip?
La triangulación de polígonos convierte cualquier contorno en un conjunto de triángulos, que es lo único que una GPU sabe rellenar. Cada edificio, parque o lago que dibuja un mapa web o una escena en WebGL pasa primero por ese paso. earcut, de Mapbox, es la librería que usa la mayoría de los stacks de mapas web para hacerlo: le pasas las coordenadas planas y los índices donde empieza cada hueco, y te devuelve tres índices de vértice por triángulo.
earstrip es el triangulador del motor de mapas móviles GLMap. Globus Software lo publicó como librería independiente el 16 de octubre de 2026 y viene en dos formatos:
- un único archivo de cabecera C++17 (header-only);
- un build de WebAssembly en npm cuya llamada principal recibe exactamente los mismos argumentos que earcut.
Se diferencia de earcut en dos puntos:
- Triangle strips. Recorta las “orejas” del polígono (ear clipping) siguiendo tiras en zigzag, así que su salida nativa necesita unos 1,7 índices por triángulo en lugar de 3.
- Anillos rotos. Cuando los anillos de un polígono se cruzan o se tocan, recurre a una triangulación de Delaunay restringida (constrained Delaunay) en lugar de devolver los triángulos que hayan quedado.
La licencia es ISC, la misma que la de earcut.
¿Cómo reemplazar earcut por earstrip?
Instalas el paquete y cambias el import; ese es todo el diff:
npm install earstrip
- import earcut from 'earcut';
+ import earstrip from 'earstrip';
- const triangles = earcut(vertices, holes, dimensions);
+ const triangles = earstrip(vertices, holes, dimensions);
Si tus datos vienen en GeoJSON, earstrip trae su propio flatten(). En nuestra prueba su salida fue idéntica a la del flatten() de earcut:
import earstrip, { flatten } from 'earstrip';
const { vertices, holes, dimensions } = flatten(geojsonPolygon.coordinates);
const triangles = earstrip(vertices, holes, dimensions);
Tres notas prácticas de la prueba:
- Formato del módulo. El paquete es solo ESM. En Node 22,
require('earstrip')igual nos funcionó gracias al soporterequire(esm)de Node. - Carga. El módulo WebAssembly viene incrustado y compila de forma síncrona donde la plataforma lo permite. Donde no, el README indica hacer
await readyantes de la primera llamada (import { ready } from 'earstrip'). - C++. Copia
include/earstrip.hppa tu proyecto. Necesita C++17 y nada más que la biblioteca estándar. La suite de tests en C++ del repositorio pasó completa en nuestra máquina.
¿earstrip es más rápido que earcut?
Depende de tus polígonos y de la máquina. Usamos los datos de benchmark del propio autor, con los checksums verificados: extractos de OpenStreetMap del voivodato de Mazovia (Polonia) y las teselas del mapa mundial de GLMap. El harness fue nuestro, contra los paquetes de npm, con un hilo y el mejor de 5 corridas.
| Prueba | Autor (Apple M4 Pro) | yoDEV (x86 Xeon) |
|---|---|---|
| 3,74 M polígonos de mapa, llamada drop-in, V8 | 1,44× más rápido | 1,08–1,19× más rápido |
Igual, la API más rápida (direct.batch) |
1,74× más rápido | 1,21–1,38× más rápido |
| 56 mil polígonos del mapa mundial, hasta 11.674 huecos en uno | 7,4× más rápido | 5,6–6,0× más rápido |
| C++ nativo vs earcut.hpp, 3,74 M polígonos | 13% más rápido | GCC 13: empate · Clang 18: 12% más rápido |
| C++ nativo, mapa mundial | 6,3× más rápido | 4,0× más rápido (GCC 13) |
Con polígonos con muchos huecos, la promesa se cumple. En el set mundial, earcut necesitó unos 10,2 segundos en Node y earstrip entre 1,7 y 1,9. Es justo el caso donde earcut paga caro por unir cada hueco al contorno, y earstrip manda directo a su ruta de Delaunay los polígonos con más de 128 anillos.
Con polígonos de mapa comunes, la ganancia es mucho menor. En nuestra máquina x86 la llamada drop-in fue entre 8 y 19 por ciento más rápida en Node 22, 24 y 26. El README reporta 44 por ciento para V8 en un M4 Pro.
En C++ nativo, depende del compilador. Hubo empate con GCC y una ventaja de 12 por ciento con Clang, así que la ventaja con datos cotidianos parece sensible al compilador y a la CPU. No investigamos por qué; reportamos lo que medimos.
Si tus datos se parecen a los nuestros y la velocidad es tu motivo para cambiar, haz un benchmark primero en el hardware donde realmente corre tu código.
¿Qué pasa con los polígonos que se cruzan a sí mismos?
earstrip los dibuja bien, y esta parte de lo que promete el autor se reprodujo con exactitud. Los datos de mapa redondeados a una grilla de teselas suelen terminar con anillos que se cruzan o se tocan, y el ear clipping asume que eso no pasa. El set principal tiene 82 polígonos que las orejas no pueden cortar de forma exacta. En ellos, los triángulos de earstrip se alejaron del relleno correcto (even-odd) en un 0,15 por ciento de los píxeles en promedio, y los de earcut.hpp en un 30,7 por ciento. El autor reporta 0,15 y 31.
Un ejemplo mínimo muestra la diferencia. Toma un polígono en forma de corbatín que se cruza a sí mismo ([0,0, 10,10, 10,0, 0,10]):
- earcut devolvió un solo triángulo y rellenó solo uno de los dos lóbulos.
- earstrip devolvió dos triángulos que cubren ambos, y
lastStatus()informóapproximate.
Ese estado le permite a tu código saber cómo se resolvió cada polígono. Los valores posibles son exact, constrained, holes-left-out, approximate y refused. En el set de 3,74 millones de polígonos, todos salvo 82 volvieron como exact.
¿Qué son los triangle strips y los necesitas en WebGL?
Un triangle strip es una lista de índices donde cada índice nuevo forma un triángulo con los dos anteriores. La GPU dibuja n triángulos con unos n + 2 índices en lugar de 3n. earstrip escribe tiras de forma nativa:
- 1,66 índices por triángulo tanto en el set principal como en el mundial, contra 3 de una lista de triángulos normal;
- 1,95 en un set de polígonos casi todos pequeños y simples, donde la ganancia es menor.
La llamada drop-in earstrip() vuelve a convertir las tiras en una lista de triángulos al estilo earcut, así que ese ahorro solo lo obtienes con las otras APIs:
strips()devuelve las tiras tal cual.- Las llamadas
directescriben el polígono directamente en la memoria de WebAssembly y devuelven un solo index buffer listo paraTRIANGLE_STRIPen WebGL 2 o WebGPU. Esa ruta fue además la más rápida en nuestro benchmark.
import { strips } from 'earstrip';
const { indices, ends, clockwise } = strips(vertices, holes);
¿Conviene cambiar de earcut a earstrip?
Cámbiate si:
- Tus datos tienen polígonos con muchos huecos (costas, bosques con claros, teselas mundiales). La aceleración de 5 a 6 veces se reprodujo.
- Renderizas datos de mapa reales que pueden traer anillos que se cruzan o se tocan, y ya has visto errores de relleno.
- Controlas el index buffer y puedes usar tiras en WebGL 2 o WebGPU.
Piénsalo dos veces si:
- Tus polígonos son pequeños y simples y la velocidad es tu único motivo. En x86 la ganancia que medimos fue modesta.
- El tamaño del bundle importa. Tal como se publica, el JavaScript de earstrip más su WebAssembly incrustado sumó unos 41 KB con gzip, frente a unos 13 KB del código fuente de earcut sin minificar. La cifra de 27 KB del README corresponde solo al binario WebAssembly.
- Necesitas una API estable. Al momento de publicar esta nota (23 de octubre de 2026), earstrip está en la versión 0.2.0, publicada tres días antes. Considera estable la llamada compatible con earcut; el resto puede cambiar antes de la 1.0.
¿Y tú? ¿Qué librería usas hoy para triangular polígonos en tu stack de mapas o WebGL?
- Velocidad con polígonos complejos
- Que dibuje bien la geometría rota
- Index buffers más pequeños (triangle strips)
- Prefiero otra opción (cuéntanos cuál)
Comenta abajo o, si este artículo te llegó por correo, responde directamente al email: tu respuesta se publica aquí.
Relacionado: Node:ffi en Node.js 26.9: cómo llamar a una librería de C sin compilar un addon nativo