2010-01-04 13 views
6

Necesito rellenar un polígono arbitrario usando un mosaico casi uniforme de triángulos. ¿Cómo haría esto? Puede proporcionar referencias a algoritmos existentes o incluso simplemente ideas o sugerencias propias.Teselar un polígono arbitrario mediante mosaico de triángulos

La siguiente se presume:

  • El polígono puede ser (puntos, pero de bonificación si usted viene con un algoritmo que trabaja para formas cóncavas) convexas
  • El polígono tiene un número arbitrario de bordes (3 o más)
  • la cantidad de teselado (preferiblemente el número de vértices añadidos por el algoritmo) debe parametrizar
  • bordes del polígono pueden ser divididos por el algoritmo
  • Tr Los iangles deben ser casi uniformes en tamaño y forma (es decir las esquinas tenderán hacia 60 grados)
  • Preferiblemente, los bordes numéricos en un vértice deben ser pocos en lugar de muchos. Esto probablemente seguirá del punto anterior (es decir, el algoritmo debería producir una "malla limpia").

Esto no es un problema fácil de resolver y espero que una solución "heurística" puede ser el más eficiente ... (¿verdad?)

+1

he añadido dos. ¿Contento? ;-) –

+0

Podría ser útil proporcionar un poco de información general sobre cuál es el problema real que está tratando de resolver. ¿Es esto una malla utilizada en simulación? Si es así, ¿qué método de simulación se está utilizando? –

+0

Bueno, sonaba demasiada tarea asignada aquí al pie de la letra. Ayudaría si declaras que es, o no es tarea. Si es una pregunta o algún tipo de desafío. Ya no es necesario que lo aclare más, según el comentario que publicó ahora lo tengo claro, pero no fue cuando publicó por primera vez su, err, desafío/pregunta/lo que sea. –

Respuesta

3

Como Jason Orendorff señaló, usted debe tratar de usar triángulo para generar una malla de calidad. Tiene muchas opciones con las que puedes jugar para tratar de obtener una malla isotrópica.Entonces, podrías tratar de usar un algoritmo iterativo para crear una triangulación bien centrada. Más detalles se enumeran en this publications page. Implementé el documento de 2007 "Triangulación planar bien centrada: un enfoque iterativo" y arroja resultados decentes en mallas de tamaño medio. Una triangulación bien centrada es aquella en la que todos los circuncentros de triángulos se encuentran dentro del triángulo respectivo. Como desea algo ligeramente diferente, simplemente podría intentar cambiar la métrica de error involucrada. Puede encontrar una medida de "no congruencia" entre los triángulos y minimizar ese error. Lo más probable es que dicha función de error no sea convexa, por lo que la optimización de gradiente conjugado no lineal descrita es tan buena como puede hacerlo.

+0

¡Muchas gracias, parece lo que estaba buscando! ¿Tiene alguna indicación del rendimiento del algoritmo? No es muy importante, solo tengo curiosidad. –

+0

Debe consultar el documento al que se hace referencia para obtener una idea de la rapidez con la que converge. En la práctica, recuerdo que lleva de cientos a miles de iteraciones. –

+0

Por lo que puedo decir, se ve mejor para las mallas simples. Más como 30 a 100 iteraciones. –

4

en realidad no suena tan complicado, algorítmicamente. ¿O me estoy perdiendo algo?

Algunos pseudocódigo:

  • lugar de un eje alineado a encerrar herméticamente alrededor de la plaza polígono.
  • Subdividir cada cuadro en cuatro elementos (similar a un árbol cuádruple), donde el número de iteraciones determina la "cantidad de teselado".
  • Cada cuadrado resultante está limpiamente fuera de su polígono (= ignorar), limpiamente dentro de su polígono (= dividido en dos triángulos de teselación resultante a lo largo de la diagonal) o interseca su polígono.
  • Las cajas exactas para los cuadrados de intersección se dejan como ejercicio para el lector. ;-) [En este punto en el tiempo, al menos.]

Sin embargo, le dará triángulos con ángulos de 45 °/45 °/90 °. Si desea acercarse lo más posible a 60 °, comience con teselando la superficie de su polígono con hexágonos (con el tamaño del hexágono como su "cantidad de teselado") y luego revisando cada uno de los seis 60 °/60 °/Triángulos de 60 ° que componen estos hexágonos. Para estos triángulos haces lo mismo que con los cuadrados en el pseudocódigo anterior, excepto por el hecho de que no necesitas dividir los que están limpiamente dentro de tu polígono ya que ellos mismos son triángulos.

¿Es esto de alguna ayuda alguna? Debería funcionar para cualquier polígono (convexo/cóncavo/con agujeros en ellos), creo, dado que lo que haces exactamente para intersectar cuadrados/triángulos maneja dichos polígonos.

+0

Esta es una de las ideas "fáciles" que tenía en mente también. Sin embargo, no ajusta realmente la forma tan bien en los bordes y la tesselación no es tan fácil de parametrizar. (Esta es una de las dos ideas que ya tengo ...) –

+0

(Está mejor pensado que el que yo tenía, así que gracias) –

4

¿Hace Triangle hacer lo que quiere?

(Las explicaciones de los algoritmos en ese sitio son mejores que cualquier cosa que pudiera ocurrir.)

+0

Desde mi inicio del sitio web, parece que no tejen triángulos de forma uniforme manera (los triángulos no son más o menos iguales en tamaño) pero me tomaré un tiempo para asegurarme. ¡Gracias de cualquier manera! –

+0

En realidad, esto se ve bastante cerca de lo que estaba pensando ... Todavía podría ser capaz de usar la triangulación de Delaunay generando puntos equidistantemente ... +1 por ahora mientras trato de resolverlo. –

+0

"El interruptor -a establece una restricción de área máxima" que parece dar como resultado triángulos de aproximadamente el mismo tamaño. Y -q especifica un ángulo mínimo. http://www.cs.cmu.edu/~quake/triangle.quality.html –

1

Esto se puede hacer para polígonos cóncavos/convexos usando un método de recorte de oreja simple (suponiendo que no necesitamos soportar orificios).

Ésta es 2 pasos, por lo que puede ser más eficiente para recortar de forma iterativa la 'mejor' la oreja para obtener resultados más uniformes, por lo que no tiene que volver a organizar la topología como un segundo paso (tu caso es distinto).
(Tenga en cuenta que las razones por las que se utilizan 2 pasos aquí es que no siempre es necesario calcular una distribución más pareja).


divulgación completa, me encontré con este problema a mí mismo, cuando necesitaba un tessellator rápido para polígonos para una aplicación de modelado en tiempo real.

aplicación de trabajo escrito en C,
que toman y el regreso de POD (float[2] matriz, rellenando una matriz uint[3]):

(Nota, el recorte del oído se basa en libgdx con optimizaciones espaciales a los controles de intersección, para escalar hasta miles de lados sin impacto en el rendimiento tan significativo, ya que el recorte todos los oídos era el registro de todos los-otros-puntos cada vez).

example output

Cuestiones relacionadas