J'essaye d'implémenter dans le code C++ l'algorithme de balayage de plan pour les intersections de segment basé sur ce livre: http://www.cs.uu.nl/geobook/. Ils suggèrent d'implémenter la structure d'état du balayage plan en utilisant un arbre de recherche binaire équilibré. J'utilise la structure std :: set pour implémenter la structure d'état mais j'ai des problèmes pour réordonner les segments qui contiennent le point "p" et leur extrémité supérieure est le point "p". Ils ont le même point de coordonnées, ce qui signifie que je ne peux pas les insérer dans std :: set parce qu'il ne permet pas de valeurs répétitives ... J'ai essayé de les insérer avec leur extrémité inférieure, mais ils vont perdre l'ordre dans lequel ils se croisent par une ligne de balayage juste en dessous de "p".Algorithme de balayage de plan: Comment ordonner les segments après le point d'intersection
Le pseudo-code qui est dans le livre dit ce qui suit:
- Insérez les segments en U (p) ∪ C (p) dans Tao. L'ordre des segments dans Tao doit correspondre à l'ordre dans lequel ils sont entrecoupés par une ligne de balayage juste en dessous de p. S'il y a un segment horizontal, il vient dernier parmi tous les segments contenant p.
- (* Suppression et réinsérer les segments de C (p) inverse l'ordre. *)
Je ne sais pas comment ils vont inverser leur ordre .. Comme j'insérer des segments Dans la structure d'état, je les trierai en fonction de leur coordonnée x d'extrémité supérieure. Je ne sais pas comment échanger leur ordre après une intersection.
Une idée?
Mise à jour: Le livre est ici: https://books.google.com/books?id=C8zaAWuOIOcC mais il y a quelques pages qui n'apparaissent pas. Il est sur le chapitre 2, pages 24, 25 et 26. L'espoir qu'il aide à donner un contexte
Best,
Ce n'est pas une bonne approche. std :: set nécessite un comparateur qui ne change pas sa sortie dans le temps, et la violation de ce * conduira à des bugs. Tout simplement parce que 'std :: set' est implémenté * en utilisant * un arbre binaire équilibré ne signifie pas qu'il peut être utilisé comme un arbre binaire équilibré primitif; la façon dont l'algorithme sweepline l'utilise nécessite des swaps manuels plutôt qu'une fonction de classement, et 'std :: set' n'est pas configuré pour cela. – Sneftel
@Sneftel Je n'ai jamais voulu dire que 'std: set' maintiendra automatiquement l'ordre correct des segments dans le statut. Vous devez toujours échanger les segments lors de la gestion des événements d'intersection. – Leon
Il ne s'agit pas seulement de maintenir l'ordre correct. 'std :: set' ne s'attend pas à ce que sa fonction de comparaison change. Si c'est le cas, votre programme peut tomber en panne. – Sneftel