Меня попросили написать функцию, которая принимает «LatLon» в качестве входных данных (LatLon — это класс с двумя двойниками: широта и долгота) и возвращает идентификатор (int) ближайшего пересечения к этой позиции. Мне даны функции, которые возвращают местоположение любого пересечения, а также возвращают расстояние между двумя позициями. Из-за «тестов производительности» мои инструкторы предложили мне хранить местоположения всех пересечений в R-дереве (из библиотеки повышения), где было бы быстрее найти ближайший перекресток, а не перебирать все пересечения. Однако я только изучаю, как работают R-деревья, и у меня возникают проблемы с их созданием.
Проблема в том, что я видел несколько примеров в Интернете, где они создают R-деревья, но что меня действительно смущает, так это то, что они используют только два аргумента, а не четыре, в одном из конструкторов. Например, они используют:
bgi::rtree‹ value_t, bgi::quadratic‹16> > rtree_;
где value_t — это пара box и unsigned int, а другой аргумент — это размер, однако, если я попытаюсь сделать:
bgi::rtree‹ точка, bgi::quadratic‹16>> пересечениеRTree;
где точка представляет собой пару беззнакового целого числа и LatLon, компилятор жалуется, что я использую неправильный конструктор и что он должен иметь четыре аргумента вместо двух.
Я прочитал онлайн и обнаружил, что должен использовать этот конструктор:
rtree (parameters_type const &, indexable_getter const &, value_equal const &, allocator_type const &)
Однако я не понимаю описания каждого аргумента, поэтому не знаю, как использовать этот конструктор. Итак, не могли бы вы помочь мне понять, что делать? И если можно, не могли бы вы привести мне короткий пример? Большое тебе спасибо.
Это класс LatLon. Он доступен только для чтения, поэтому я не могу его изменить:
class LatLon{
public:
LatLon(){}
explicit LatLon(float lat_, float lon_) : m_lat(lat_),m_lon(lon_){}
double lat() const { return m_lat; }
double lon() const { return m_lon; }
private:
float m_lat = std::numeric_limits<float>::quiet_NaN();
float m_lon = std::numeric_limits<float>::quiet_NaN();
friend class boost::serialization::access;
template<class Archive>void serialize(Archive& ar, unsigned int)
{ ar & m_lat & m_lon; }
};
std::ostream& operator<<(std::ostream& os,LatLon);
std::array<LatLon,4> bounds_to_corners(std::pair<LatLon,LatLon> bounds);
Вот почему я пытаюсь сделать:
#include "LatLon.h"
#include <string>
#include <vector>
#include <cmath>
#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <algorithm>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
using namespace std;
typedef pair<unsigned,LatLon> point;
bgi::rtree<point, bgi::quadratic<16>> intersectionRTree;
for (unsigned intersection = 0; intersection < intersectionNumber; intersection++)
{point intP = make_pair(intersection,getIntersectionPosition(intersection));
intersectionRTree.insert(intP);}
Функция getIntersectionPosition возвращает значение LatLon, intervalNumber — это максимальное количество пересечений, а пересечение — это индекс пересечения.
Компилятор дает мне детали ошибки, которая только отправляет меня к другим файлам, но на самом деле никогда не говорит мне, где я ошибаюсь.