5

He estado buscando en la red un algoritmo que te permita crear representaciones de niveles de detalle (LOD) de polígonos 2D, pero no puedo encontrar CUALQUIER referencia decente. Tal vez estoy usando términos de búsqueda incorrectos, pero todos los resultados de búsqueda son para algoritmos 3D LOD, que, supongo, no pueden (?) Realmente aplicarse en 2D.Algoritmo de nivel 2D de detalle (LOD)

Estoy seguro de que antes de la embestida de los gráficos 3D, muchas personas habrían trabajado en algoritmos 2D LOD. ¿Alguna pista o punteros a donde puedo obtener más información? ¡Gracias!

+1

Interesante, ¿tal vez buscando la simplificación de la forma, la abstracción de la imagen o incluso la compresión? ¿Cuáles son los requisitos para el LOD? Al igual que en la voluntad de la imagen se redujo? ¿Es para el rendimiento, para guardar la memoria o emular la profundidad? –

+0

Estoy buscando mejorar el rendimiento de un algoritmo existente (heredado). Básicamente, quiero una aproximación razonable del "envoltorio retráctil" del polígono, donde se conservan las principales características externas y los detalles internos ocultos. +1 para las palabras clave sugeridas. ¡Gracias! – tathagata

Respuesta

4

Aparte del algoritmo más estúpido obvio que sería tomar cada N-ésimo vértice del polígono (reduciendo el número de vértices por N), aquí hay una idea inspirada en algunos algoritmos 3D.

Normalmente, en 3D, lo que se necesita es eliminar las caras que contribuyen menos al volumen general. Para hacer esto, tratamos de simplificar las áreas "más planas" del modelo.

Ahora en 2D, que se podría traducir esto a "simplificar los segmentos que tienen el menor ángulo entre ellos una primera implementación ingenua podría ser:.

  1. Calcular todos los ángulos entre los segmentos de Si y Si + 1 de el polígono
  2. Tome todos los ángulos por debajo de un umbral dado (o tome los M menores ángulos)
  3. Simplifique los segmentos que identificamos en 2. (reemplace [Pi, Pi + 1] y [Pi + 1, Pi + 2 ] por [Pi, Pi + 2])
  4. Repita desde 1. hasta que hayamos reducido suficientemente nuestro polígono en

Por supuesto, esto no es óptimo, pero debería ser una buena operación entre calidad y velocidad. En lugar del ángulo, se puede tomar la distancia mínima entre el punto medio de dos segmentos (Pi + 1) y el segmento potencialmente simplificado ([Pi, Pi + 2])

Editar:

Otro algoritmo I intentaría si yo no necesitaba demasiada rendimiento:

  1. Considere los vértices del polígono originales como los puntos de control de una spline de Catmull-Rom
  2. tesselate este spline en el número deseado de puntos

Finalmente, encontré algo de código fuente para que en ese enlace: http://motiondraw.com/md/as_samples/t/LineGeneralization/demo.html, así como la algoritmos asociados: http://www.geom.unimelb.edu.au/gisweb/LGmodule/LGSimplification.htm

+0

Gracias por las sugerencias. Creo que podré usar una combinación de los algoritmos sugeridos y el sugerido por Juraj anteriormente para lograr algo parecido a lo que deseo. +1.Desafortunadamente, no puedo marcar ambas respuestas como correctas, por lo que marcó esta como correcta, pero el 'algoritmo de Douglas-Peucker' sugerido por Juraj es igualmente bueno. – tathagata

+0

Sí, no sabía sobre el algoritmo de Ram Douglas Peucker, pero me gusta. Lo bueno es que puede detenerse fácilmente cuando alcanza su número máximo de puntos, por ejemplo. –

4

Buscar Douglas-Peucker algorithm que se utiliza para simplificar polilíneas, pero puede ser extendida para soportar polígonos. Es lo que he usado. También hay extensiones topológicamente estables si es necesario.

+0

+1 por dejarme saber acerca de este genial algoritmo. Esto podría funcionar, pero debo verificarlo en mi contexto. Y esto es algo que me perdí de mencionar en la pregunta, pero no sé exactamente cómo explicar esto en palabras, pero vea mi comentario a la pregunta principal anterior. – tathagata

Cuestiones relacionadas