2016-04-25 10 views
1

Ich möchte R-tree im Boost Geometry-Paket verwenden, um einen räumlichen Index zu erstellen. Ich möchte meine eigene Box (CRectangle) -Datenstruktur verwenden, da ich eine Bibliothek von Drittanbietern für Polygonoperationen verwende.Boost-Geometrie: Templating BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES

Um zu beginnen, folgte ich diesem Tutorial zum Registrieren von benutzerdefinierten Point/Box-Typen. http://www.boost.org/doc/libs/1_55_0/libs/geometry/doc/html/geometry/reference/adapted/register/boost_geometry_register_box_2d_4values.html

Ich kam zu dem folgenden (vereinfachten) Code, der OK funktioniert. Ich bekomme eine korrekte Fläche von 4.

#include <iostream> 
#include <boost/geometry.hpp> 
#include <boost/geometry/index/rtree.hpp> 
#include <boost/geometry/geometries/register/point.hpp> 
#include <boost/geometry/geometries/register/box.hpp> 

namespace bg = boost::geometry; 
namespace bgi = boost::geometry::index; 

struct dummy_pt 
{ 
    int x,y; 
}; 

class CRectangle 
{ 
private: 
    int xmin, xmax, ymin, ymax; 

public: 
    // implementation not shown. 
    int xmin(); 
    int ymin(); 
    int xmax(); 
    int ymax(); 
} 

BOOST_GEOMETRY_REGISTER_POINT_2D(dummy_pt, int, bg::cs::cartesian, x, y) 
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle, dummy_pt, xmin(), ymin(), xmax(), ymax()) 

int main(int argc, char** argv) 
{ 
    CRectangle x = bg::make<CRectangle>(0,0,2,2); 
    std::cout << "Area: " << bg::area(x) << std::endl; 
    return 0; 
} 

Mein Problem ist, wie registriere ich CRectangle, wenn es templated ist? Das heißt,

template <typename T> 
class CRectangle 
{ 
    public: 
    T xmin(); 
    T xmax(); 
    T ymin(); 
    T ymax(); 

    private: 
    T xmin,xmax,ymin,ymax; 
} 

Hier konnte ich verwenden:

CRectangle<int> or CRectangle<double> 

Ich weiß, es ist BOOST_GEOMETRY_REGISTER_BOX_TEMPLATED(), aber das erfordert lowerLeft() und obere rechte() Funktionen. In meinem Fall wird die CRectangle-Klasse diese Methoden nicht haben, da es von einer Drittanbieterbibliothek kommt.

Ich könnte eine Unterklasse schreiben und diese zwei Methoden zur Verfügung stellen, aber ich würde gerne wissen, ob es möglich ist, Vorlagen mit BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES oder anderen einfachen Methoden zu verwenden?

Vielen Dank für Anregungen/Ideen.

Antwort

1

Ich hätte mehr Untersuchungen durchführen sollen. Das folgende Code-Snippet hat funktioniert! Ich habe gerade beide Möglichkeiten registriert:

BOOST_GEOMETRY_REGISTER_POINT_2D(dummy_pt, int, bg::cs::cartesian, x, y) 
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<int>, dummy_pt, xmin(), ymin(), xmax(), ymax()) 
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<double>, dummy_pt, xmin(), ymin(), xmax(), ymax()) 

int main(int argc, char** argv) 
{ 
    CRectangle<int> x = bg::make<CRectangle<int>> (0,0,2,2); 
    CRectangle<double> y = bg::make<CRectangle<double>> (0,0,3,3); 
    std::cout << "Area: " << bg::area(x) << std::endl; 
    std::cout << "Area: " << bg::area(y) << std::endl; 
    return 0; 
} 

Ich wäre immer noch interessiert, wenn es eine bessere Lösung als Brute Forcing gibt.

+0

Erweitern Sie einfach die Makros. Es wird eine (kleine) Menge von Merkmalen definieren. Verwenden Sie partielle Vorlagenspezialisierungen, um sie generisch zu definieren. Job erledigt. – sehe

+0

Danke, aber ich bin nicht sehr gut mit Template-Programmierung. Können Sie ein kleines Beispiel geben, um es klarer zu machen? – user4979733

+0

Entschuldigung. In diesem Fall scheint Ihre Arbeit gut zu sein. Warum willst du, dass ich Dinge tue, die du nicht willst? Sie können immer mit konkreten Fragen zu SO kommen, wenn Sie nicht weiterkommen. – sehe