En nuestro sistema, existen los requisitos que queremos mover algunas líneas de origen (con baja precisión) a líneas de referencia (con alta precisión). Las siguientes imágenes muestran los casos de uso normales. La roja es una línea de origen y la azul es una línea de referencia.
Para este caso, la línea de origen se movería parcialmente, y el resultado sería como muestra la línea verde:
Hay situaciones en las que la línea de origen debe moverse por completo.
Resultado:
Actualmente, nuestra solución es proyectar el punto de cabecera / final de la línea de origen a la línea de referencia y viceversa, luego buscar los puntos proyectados en la línea de origen y de referencia. Con estos puntos proyectados, podemos extraer la parte necesaria de la fuente y la línea de referencia y luego combinarlos en uno nuevo.
Esto funciona para la mayoría de los casos, pero hay casos en que este método no funciona. Específicamente, cuando cualquiera de las líneas tiene forma de "C" o el punto de cabecera está muy cerca del punto final. Las siguientes dos imágenes dan el escenario.
Aplicando mi algoritmo, obtenemos el resultado:
En cierto modo, es comprensible porque el algoritmo actual solo encuentra puntos proyectados y extrae líneas.
Lo que esperábamos es algo como esto:
Entonces, lo que necesito es un algoritmo más robusto para hacer esto, de modo que también pueda manejar casos especiales como el anterior. Intenté proyectar todos los puntos de una línea a otra y encontrar los dos puntos proyectados más cercanos al punto de inicio / final de la línea proyectada, pero no tuve suerte. Aún así puedo encontrar casos que dan resultados inesperados.
¿Alguien ha encontrado problemas similares antes? También sería genial si hay un software o una biblioteca que pueda hacer un trabajo similar. Cualquier respuesta será apreciada.
Respuestas:
Mi estimación es que los casos finales a menudo serán excepciones que no son programables por máquina. Trabajé con problemas similares y siempre requirieron una cierta cantidad de edición manual. Lo que debe sintonizar son las excepciones producidas por el caso y servirlas en un sistema de gestión de trabajo a un usuario final.
fuente
Necesitará una tolerancia de ajuste y una tolerancia de giro para este algoritmo (supongo que ya tiene una tolerancia de ajuste).
Proyecte el punto de cabecera desde la línea de origen a la línea de referencia. Rompa la línea de referencia en este punto proyectado.
Atraviese la línea de origen desde el punto principal hasta el primer vértice para obtener la dirección de desplazamiento a lo largo de la línea de origen. Atraviese cada una de sus dos líneas de referencia desde el punto fuente proyectado hasta el siguiente vértice. Si la dirección de desplazamiento está dentro de la tolerancia de giro de la dirección de desplazamiento desde el punto de cabecera en su línea de origen, aplique su algoritmo normalmente, pero solo usando esa sección de la línea de referencia. Si el algoritmo llega al final de la línea de origen, ya está. De lo contrario, rompa la línea de origen entre la pieza transformada y la pieza no transformada (que incluirá el punto final).
Ahora tome la pieza no transformada y proyecte el punto final en la línea de referencia original. Realice el mismo procedimiento que antes ... atraviese la fuente desde el punto final hasta el primer vértice para encontrar la dirección de desplazamiento. Rompa la línea de referencia en el punto final del proyecto y recorra cada uno para encontrar si la dirección de desplazamiento desde el punto final proyectado está dentro de la tolerancia de giro. Si es así, use esa parte de la línea de referencia para aplicar el algoritmo normalmente.
Recuerde, en este punto solo está utilizando la pieza no transformada, por lo que no se superpondrá con la transformación del punto de cabecera.
Finalmente, combine las dos piezas de línea resultantes si es necesario: la pieza transformada del punto de cabecera desde el punto de cabeza proyectado hasta el punto de ruptura no transformado y luego en la pieza transformada del punto final desde el punto de ruptura no transformado hasta el punto final proyectado.
fuente