Untitled
unknown
plain_text
2 years ago
2.7 kB
9
Indexable
cpp
#include <iostream>
#include <vector>
#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
// Custom Point class representing the four points of the rectangle
class MyPoint {
public:
MyPoint(float x1, float x2, float x3, float x4) : x1_(x1), x2_(x2), x3_(x3), x4_(x4) {}
float getX1() const { return x1_; }
float getX2() const { return x2_; }
float getX3() const { return x3_; }
float getX4() const { return x4_; }
private:
float x1_;
float x2_;
float x3_;
float x4_;
};
// Custom geometric traits for the MyPoint class
namespace boost { namespace geometry { namespace traits {
template <>
struct tag<MyPoint> {
using type = point_tag;
};
template <>
struct coordinate_type<MyPoint> {
using type = float;
};
template <>
struct coordinate_system<MyPoint> {
using type = cs::cartesian;
};
template <>
struct dimension<MyPoint> : boost::mpl::int_<4> {};
template <>
struct access<MyPoint, 0> {
static float get(const MyPoint& point) { return point.getX1(); }
static void set(MyPoint& point, const float& value) { point.x1_ = value; }
};
template <>
struct access<MyPoint, 1> {
static float get(const MyPoint& point) { return point.getX2(); }
static void set(MyPoint& point, const float& value) { point.x2_ = value; }
};
template <>
struct access<MyPoint, 2> {
static float get(const MyPoint& point) { return point.getX3(); }
static void set(MyPoint& point, const float& value) { point.x3_ = value; }
};
template <>
struct access<MyPoint, 3> {
static float get(const MyPoint& point) { return point.getX4(); }
static void set(MyPoint& point, const float& value) { point.x4_ = value; }
};
}}} // namespace boost::geometry::traits
// Define the rtree type with custom point type
typedef bgi::rtree<MyPoint, bgi::linear<16>> RTree;
int main() {
// Create an empty rtree
RTree rtree;
// Insert some rectangles into the tree
rtree.insert(MyPoint(1.0, 2.0, 3.0, 4.0));
rtree.insert(MyPoint(5.0, 6.0, 7.0, 8.0));
rtree.insert(MyPoint(9.0, 10.0, 11.0, 12.0));
// Define a query rectangle
MyPoint queryRectangle(2.0, 3.0, 4.0, 5.0);
// Perform the intersection search
std::vector<MyPoint> result;
rtree.query(bgi::intersects(queryRectangle), std::back_inserter(result));
// Print the matching rectangles
std::cout << "Rectangles intersecting with the query rectangle:" << std::endl;
for (const auto& point : result) {
std::cout << "(" << point.getX1() << ", " << point.getX2() << ", " << point.getX3() << ", " << point.getX4() << ")" << std::endl;
}
return 0;
}Editor is loading...