Triangular 3,7 millones de polígonos de mapas en 489 ms, más rápido que earcut

Faster than earcut: triangulating 3.7M map polygons in 489 ms

Triangular 3,7 millones de polígonos de mapas en 489 ms, más rápido que earcut

El equipo de un motor de mapas publicó earstrip, un triangulador de polígonos en un solo header de C++ y con build de WebAssembly en npm, bajo licencia ISC como earcut. En C++ es un 14% más rápido que earcut.hpp y en el navegador entre 1,4 y 2,1 veces más veloz que earcut.js. El artículo recorre la optimización paso a paso, desde el recorte de orejas ingenuo hasta técnicas como probar solo los vértices cóncavos y evitar ramas.

Casi la mitad de los polígonos de Masovia, 1,8 millones, tienen cuatro vértices o menos. Un triángulo no necesita ningún corte y un cuadrilátero convexo son dos triángulos, y aun así el código de Delaunay dedica 419 ms a ellos, construyendo cada triangulación desde cero.
  1. morishuz

    increíble. ¡las mejoras de rendimiento se ven impresionantes!

    soy el autor de Delaunay32, un triangulador de delaunay restringido con soporte para polígonos y agujeros. usa divide y vencerás en lugar de inserción incremental, así que tengo curiosidad por ver cómo se compararía con el baseline de delaunay aquí.

    https://github.com/morishuz/delaunay32

    todavía no he hecho benchmarks en tu corpus, y nuestra API actual de polígonos requiere anillos simples con agujeros que no se toquen. ¡gracias por publicar los datasets, parecen útiles para probar y comparar!

  2. amelius

    Deberían mencionar a la madre de todos los trianguladores:

    https://www.cs.cmu.edu/~quake/triangle.html

  3. mistercow

    Durante mucho tiempo me he preguntado por qué el ear clipping + optimizaciones ha ganado en triangulación frente a cosas como el método trapezoidal de Seidel, que tiene una complejidad temporal O(nlog*n) y maneja agujeros de forma natural. Sé que la big-O no lo es todo, pero eso es esencialmente lineal versus cuadrático, y parece que nos importa triangular polígonos cada vez más complejos con el tiempo.

    ¿Es solo una cuestión de calidad de los triángulos? ¿Seidel lleva a demasiados slivers difíciles de manejar?

  4. mourner

    Hola Evgen, aquí el autor de Earcut — ¡gracias por el artículo y por una librería realmente genial! Tengo que ver si hay algún truco que pueda tomar prestado para la versión JS de Earcut. :)

    Una cosa a tener en cuenta es que deliberadamente tuve que rechazar algunas de las optimizaciones potenciales para mantener la librería pequeña, de modo que el tamaño del bundle no se dispare — para la mayoría de las aplicaciones prácticas (por ejemplo, Mapbox GL JS), ya es suficientemente rápida (y 4.1k min/gz). Tengo curiosidad por saber cuánto mide la build WASM de Earstrip.

    En el lado de C++, Mapbox ahora usa un enfoque híbrido en el que los polígonos pequeños se procesan con earcut.hpp, mientras que los polígonos grandes y complejos cambian a un algoritmo diferente basado en descomposición monótona, porque aunque tiene constantes más altas en la complejidad algorítmica, escala mucho mejor con el tamaño de la entrada.

  5. stymaar

    Veo que el resultado contiene muchos triángulos muy largos y muy delgados. ¿No son esos generalmente el peor caso para el rasterizador de la GPU?

Más de este día

2026-10-22