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