2016-12-06 2 views
1

Lorsque le polygone est une boîte alignée sur les axes "POLYGON ((0 0,1 0,1 1,0 1))", union_() ne donnera pas un résultat correct, juste une sortie vide. En fait, union_() de n'importe quel polygone ne devrait pas être vide. Mais si vous changez le polygone vert de la boîte d'alignement d'axes en "POLYGON ((2 1.3.2.4 1.7.2.8 1.8))", alors il en sort une sortie significative (pas vide).Pourquoi boost :: geometry :: union_ ne peut pas donner de résultat pour axis-aligned-box?

Est-ce un bug de boost union_()?

Un grand merci

int main() 
{ 
    typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon; 

    polygon green, blue; 

    boost::geometry::read_wkt(
     "POLYGON((0 0,1 0,1 1,0 1))", 
     green); 

    boost::geometry::read_wkt(
     "POLYGON((2 1.3,2.4 1.7,2.8 1.8))", 
     blue); 

    std::deque<polygon> output; 
    boost::geometry::union_(green, blue, output); 

    int i = 0; 
    std::cout << "green && blue:" << std::endl; 
    BOOST_FOREACH(polygon const& p, output) 
    { 
     std::cout << i++ << ": " << boost::geometry::area(p) << std::endl; 
    } 

    return 0; 
} 
+0

Il semble que j'ai eu une réponse. Mais je dois le vérifier. Appelez simplement boost :: geometry :: correct() pour chaque polygone. Et puis boost donnera le résultat correct pour uion_() et intersection(). Attends une minute. Laisse moi le tester. –

Répondre

1

Il y a une question simmilar à ce sujet. L'algoritme nécessite certaines conditions préalables. 1) Le polygone doit être dans le sens des aiguilles d'une montre. 2) Le polygone doit être fermé, c'est-à-dire que le dernier point coïncide juste avec le premier point. Donc, pour corriger les problèmes dans les données polygonales orignial, appelez boost :: geometry :: correct() pour que les données répondent aux règles. Et l'algorithme acceptera le polygone et donnera le résultat correct.

Why boost::geometry::intersection does not work correct?