Estoy trabajando en javascript y tratando de implementar un algoritmo que triangula un polígono (algo convexo o cóncavo pero que se supone que es un polígono simple, no autocruzado y sin agujeros).
He encontrado una solución en la web, pero solo está en pseudocódigo y estoy tratando de implementarla. (Fuente del algoritmo: https://sites.cs.ucsb.edu/~suri/cs235/Triangulation.pdf página 19). El primer paso es dividir el polígono en trapecios con un algoritmo de barrido plano , que se describe como "En cada vértice, extienda la línea vertical hasta que toque el borde de un polígono. Cada cara de esta descomposición es un trapezoide, que puede degenerar en un triángulo".
Teniendo en cuenta que mi polígono es un conjunto de coordenadas, ¿cómo sé que mi línea cruza el polígono?
Estaba pensando que podría hacer algo como
pero suena exagerado ya que tiene una complejidad O(n²) y el pseudocódigo anuncia O(n*log(n)). Y no puedo detenerme cuando encontré una solución, ya que mi polígono podría "doblarse" y habría múltiples puntos de cruce.
¿Hay otra forma de encontrar los puntos donde la línea cruza el polígono? (O una forma simple de triangular el polígono en primer lugar)
Puede haber formas más fáciles de resolverlo, pero este podría ser un enfoque:
Utilice elalgoritmo de Bentley Ottman para encontrar intersecciones en un conjunto de segmentos de línea. Dado que su polígono no se interseca a sí mismo, puede simplemente agregar sus segmentos de barrido y encontrar sus intersecciones en tiempo O ((n + k) log n) , donde k es el número de intersecciones. Siempre que el número total de intersecciones sea O(n) (que será el caso si su polígono no tiene una forma demasiado loca), la complejidad de tiempo resultante debería ser O(n log n) .