2017-09-07 2 views
2

J'essaie actuellement d'écrire un algorithme capable de trouver des groupes individuels de lignes connectées dans un ensemble de lignes plus grand. Les images ci-dessous devraient expliquer cela un peu plus clairement.Algorithme permettant de trouver des groupes de lignes individuels et fermés dans un grand nombre de lignes connectées

Connected lines before

Groups of lines after

Dans la première image vous pouvez voir un ensemble de lignes. Ce que j'essaie de faire est de diviser ces lignes en 3 groupes, comme on le voit sur la deuxième image. Les groupes rouge et vert partagent une ligne.

Je peux supposer que chaque ligne a une coordonnée de début et de fin, et chaque ligne peut appartenir à un ou plusieurs groupes.

J'essaye actuellement d'écrire une fonction récursive qui suit chaque ligne jusqu'à ce qu'elle atteigne un point final avec une ou plusieurs lignes qu'elle peut suivre. À ce stade, la fonction se rappelle elle-même jusqu'à ce que les lignes reviennent au point de partage. Cependant, cela s'avère infructueux.

La sortie de cet exemple, comme indiqué dans la deuxième image, doit être constituée de 3 groupes de lignes distincts, stockés dans une liste. J'utilise actuellement C#, mais je devrais être capable d'utiliser un algorithme approprié dans n'importe quelle langue, y compris le pseudocode. Je sais qu'il doit y avoir un algorithme qui peut y parvenir, mais je n'arrive pas à le résoudre ou à le trouver en ligne.

+1

Il est vraiment difficile de donner des conseils sans voir une partie de votre code existant. – mjwills

+0

Comme c'est actuellement écrit cette question correspond mieux à [ComputerScience] (https://cs.stackexchange.com/help/on-topic) ou [Science computationnelle] (https://scicomp.stackexchange.com/help/on- topic) –

+0

Vous pouvez essayer de remplir toute la zone en utilisant plusieurs fois l'algorithme [flood fill] (https://en.wikipedia.org/wiki/Flood_fill). Le nouveau point de départ de l'opération de remplissage suivante est un pixel non encore rempli. Ceci identifierait les sous-zones connectées entourées de polygones fermés. –

Répondre

1

Dans le langage de la théorie des graphes (où les sommets sont tous les points de terminaison de ligne et chaque arête est une ligne), votre problème est de trouver toutes les faces d'un graphe planaire. Ceci est parfois appelé traversée de face plane. Il existe des ressources que vous pouvez consulter pour obtenir des informations à ce sujet, y compris this mathoverflow question. Bien que ce soit une bibliothèque C++ et non C#, le Boost Graph Library a une API pour la traversée de faces planaire, et consulter sa documentation pourrait être utile.