2017-05-21 1 views
0

J'utilise un arbre de segments multidimensionnel dans CGAL (Segment_tree_d), avec 11 dimensions. Mon objectif est de trouver des intervalles qui se chevauchent, compte tenu d'un intervalle de requête (window_query). Je suis capable de le faire, sauf lorsque les intervalles sont de taille 0. Je montre un exemple minimal, avec un arbre à trois dimensions, qui produit les mêmes problèmes. Est-ce une limitation fondamentale? Y a-t-il une option de configuration ou une classe différente que je peux utiliser? Mon cas d'utilisation n'a que des coordonnées entières, donc je peux contourner ce problème en ajoutant une petite fraction de chaque côté de l'intervalle, mais je ne veux pas le faire s'il y a une meilleure solution.Arborescence de segments dans CGAL avec des intervalles de taille 0

Source Code

#include <CGAL/Cartesian.h> 
#include <CGAL/Segment_tree_k.h> 
#include <CGAL/Range_segment_tree_traits.h> 
typedef CGAL::Cartesian<int> K; 
typedef CGAL::Range_segment_tree_set_traits_3<K> Traits; 
typedef CGAL::Segment_tree_3<Traits > Segment_tree_3_type; 
int main() 
{ 
    typedef Traits::Interval Interval; 
    typedef Traits::Key Key; 
    std::list<Interval> InputList, OutputList; 

    InputList.push_back(Interval(Key(1,5,7), Key(1,5,7))); 
    Segment_tree_3_type Segment_tree_3(InputList.begin(),InputList.end()); 

    Interval a(Key(3,6,5), Key(3,6,5)); 
    Segment_tree_3.window_query(a,std::back_inserter(OutputList)); 
} 

Sortie:

CGAL warning: check violation! 
Expression : m_interface.comp(m_interface.get_left(*count), m_interface.get_right(*count)) 
File  : /usr/include/CGAL/Segment_tree_d.h 
Line  : 542 
Explanation: invalid segment ignored 
Refer to the bug-reporting instructions at http://www.cgal.org/bug_report.html 
CGAL warning: check violation! 
Expression : m_interface.comp(m_interface.get_right_win(win), m_interface.get_left_win(win)) 
File  : /usr/include/CGAL/Segment_tree_d.h 
Line  : 636 
Explanation: invalid window -- query ignored 
Refer to the bug-reporting instructions at http://www.cgal.org/bug_report.html 

Répondre

1

Extrait de here:

Un unidimensionnel arbre segment est un arbre binaire de recherche aussi bien, mais avec une dimension données d'intervalle en tant que données d'entrée. Les données d'intervalle unidimensionnelles sont une paire (c'est-à-dire, 2-uplets) (a, b), où a et b sont des données ponctuelles unidimensionnelles du même type et < b. La paire (a, b) représente un intervalle semi-ouvert [a, b). De manière analogue, un intervalle d-dimensionnel est représenté par un d-tuple d'intervalles unidimensionnels.