Em nosso sistema, existem os requisitos que queremos mover algumas linhas de origem (com baixa precisão) para linhas de referência (com alta precisão). As figuras a seguir apresentam os casos de uso normais. O vermelho é uma linha de origem e o azul é uma linha de referência.
Nesse caso, a linha de origem seria movida parcialmente e o resultado seria o que a linha verde mostra:
Há situações em que a linha de origem precisa ser movida completamente.
Resultado:
Atualmente, nossa solução é projetar o ponto inicial / final da linha de origem na linha de referência e vice-versa e, em seguida, encontrar pontos projetados na linha de origem e referência. Com esses pontos projetados, podemos extrair a parte necessária da fonte e da linha de referência e depois combiná-las em uma nova.
Isso funciona na maioria dos casos, mas há casos em que esse método não funciona. Especificamente, quando qualquer uma das linhas tem a forma de um "C" ou o ponto da cabeça está muito próximo do ponto final. As próximas duas fotos mostram o cenário.
Aplicando meu algoritmo, obtemos o resultado:
De certa forma, é compreensível porque o algoritmo atual apenas encontra pontos projetados e extrai linhas.
O que esperávamos é algo assim:
Então, o que eu preciso de um algoritmo mais robusto para fazer isso, para que ele também possa lidar com casos especiais como o anterior. Eu tentei projetar todos os pontos de uma linha para outra e encontrar os dois pontos projetados que mais se aproximarem do ponto inicial / final da linha projetada, mas não houve sorte. Ainda posso encontrar casos que dão resultados inesperados.
Alguém já se deparou com problemas semelhantes antes? Seria ótimo também se houver um software ou biblioteca fazer um trabalho semelhante. Qualquer resposta será apreciada.
Respostas:
Minha estimativa é que os casos finais geralmente serão exceções que não são programáveis por máquina. Eu trabalhei com problemas semelhantes e eles sempre exigiam uma certa quantidade de edição manual. O que você precisa ajustar são as exceções que estão sendo produzidas pelo caso e as servem em um sistema de gerenciamento de trabalho para um usuário final.
fonte
Você precisará de uma tolerância de snap e de tolerância a esse algoritmo (presumo que você já tenha uma tolerância de snap).
Projete o ponto principal da linha de origem para a linha de referência. Quebre a linha de referência neste ponto projetado.
Atravesse a linha de origem do ponto principal até o primeiro vértice para obter a direção da viagem ao longo da linha de origem. Percorra cada uma das suas duas linhas de referência do ponto de origem projetado até o próximo vértice. Se a direção da viagem estiver dentro da tolerância de curva da direção da viagem a partir do ponto principal na linha de origem, aplique seu algoritmo normalmente, mas apenas usando essa seção da linha de referência. Se o algoritmo chegar ao fim da linha de origem, você estará pronto. Caso contrário, quebre a linha de origem entre a peça transformada e a peça não transformada (que incluirá o ponto final).
Agora pegue a peça não transformada e projete o ponto final na linha de referência original. Execute o mesmo procedimento de antes ... atravesse a fonte do ponto final até o primeiro vértice para encontrar a direção do percurso. Quebre a linha de referência no ponto final do projeto e percorra cada uma delas para descobrir se a direção do percurso a partir do ponto final projetado está dentro da tolerância à curva. Nesse caso, use essa parte da linha de referência para aplicar o algoritmo normalmente.
Lembre-se de que, neste ponto, você está usando apenas a peça não transformada, para não se sobrepor à transformação do ponto principal.
Por fim, mescle as duas peças de linha resultantes, se necessário: a peça transformada do ponto de cabeçote da ponta projetada para o ponto de interrupção não transformado e, em seguida, no ponto final peça transformada do ponto de interrupção não transformado para o ponto final projetado.
fonte