Dans notre système, nous avons besoin de déplacer certaines lignes source (avec une faible précision) vers des lignes de référence (avec une haute précision). Les images suivantes donnent les cas d'utilisation normaux. Le rouge est une ligne source et le bleu est une ligne de référence.
Dans ce cas, la ligne source serait déplacée partiellement et le résultat serait comme le montre la ligne verte:
Il y a des situations où la ligne source doit être déplacée complètement.
Résultat:
Actuellement, notre solution consiste à projeter le point de tête / extrémité de la ligne source sur la ligne de référence et vice versa, puis à trouver les points projetés sur la ligne source et de référence. Avec ces points projetés, nous pouvons extraire la partie nécessaire de la ligne source et de référence, puis les combiner en une nouvelle.
Cela fonctionne pour la plupart des cas, mais il y a des cas où cette méthode ne fonctionne pas. Plus précisément, lorsque l'une des lignes a la forme d'un "C" ou que le point de tête est très proche du point final. Les deux images suivantes donnent le scénario.
En appliquant mon algorithme, nous obtenons le résultat:
D'une certaine manière, cela est compréhensible car l'algorithme actuel trouve simplement les points projetés et extrait les lignes.
Ce que nous attendions est quelque chose comme ceci:
Donc, j'ai besoin d'un algorithme plus robuste pour le faire afin qu'il puisse également gérer des cas spéciaux comme le précédent. J'ai essayé de projeter tous les points d'une ligne à une autre et de trouver les deux points projetés les plus proches du point de tête / extrémité de la ligne projetée, mais il n'y a pas eu de chance. Je peux toujours trouver des cas qui donnent des résultats inattendus.
Quelqu'un a-t-il déjà rencontré des problèmes similaires? Ce serait également formidable s'il existe un logiciel ou une bibliothèque capable de faire un travail similaire. Toute réponse sera appréciée.
Réponses:
Mon estimation est que les cas finaux seront souvent des exceptions qui ne sont pas programmables par machine. J'ai travaillé avec des problèmes similaires et ils nécessitaient toujours une certaine quantité d'édition manuelle. Ce dont vous avez besoin pour régler ce sont les exceptions qui sont produites par le cas et les servir dans un système de gestion du travail à un utilisateur final.
la source
Vous aurez besoin d'une tolérance d'accrochage et d'une tolérance de virage pour cet algorithme (je suppose que vous avez déjà une tolérance d'accrochage).
Projetez le point de tête de la ligne source à la ligne de référence. Brisez la ligne de référence à ce point projeté.
Traversez la ligne source du point de tête au premier sommet pour obtenir la direction du déplacement le long de la ligne source. Parcourez chacune de vos deux lignes de référence du point source projeté au sommet suivant. Si la direction de déplacement se situe dans la tolérance de virage de la direction de déplacement à partir du point de tête sur votre ligne source, appliquez votre algorithme normalement, mais uniquement en utilisant cette section de la ligne de référence. Si l'algorithme atteint la fin de la ligne source, vous avez terminé. Sinon, coupez la ligne source entre la pièce transformée et la pièce non transformée (qui inclura le point final).
Maintenant, prenez la pièce non transformée et projetez le point final sur la ligne de référence d'origine. Suivez la même procédure que précédemment ... parcourez la source du point final au premier sommet pour trouver le sens de la marche. Rompez la ligne de référence au point final du projet et parcourez chacun pour trouver si la direction de déplacement à partir du point final projeté se situe dans la tolérance de virage. Si c'est le cas, utilisez cette partie de la ligne de référence pour appliquer l'algorithme normalement.
N'oubliez pas qu'à ce stade, vous n'utilisez que la pièce non transformée, de sorte que vous ne chevaucherez pas avec la transformation du point de tête.
Enfin, si nécessaire, fusionnez les deux pièces de ligne résultantes: la pièce transformée du point de tête du point de tête projeté au point de rupture non transformé, puis sur la pièce transformée du point de fin du point de rupture non transformé au point de fin projeté.
la source