задан следующий набор точек в векторе {(100, 150), (101, 152), (102, 151), (105, 155), (50, 50), (51, 55), (55, 55) , (150, 250), (190, 260)}
Мне нужно определить соседние точки и их количество. Допустим, допустимое расстояние было установлено равным 5. Теперь мне нужен следующий вывод: частота точки ( 100, 150 ) с 5 единицами равна 4. частота точки ( 50, 50 ) с 5 единицами равна 3 частоте точки ( 150 , 250 ) в пределах 5 единиц равна 1 частота точки ( 190 , 260 ) в пределах 5 единиц равна 1
Я попробовал решение этой проблемы с помощью RTree, но не смог определить логику исключения всех соседних точек в качестве кандидатов. Средства После того, как я определил, что есть четыре соседа (100, 150), я не хочу идентифицировать соседей этих соседей. Я хотел бы перейти к следующему значению. Вот предположения: 1. первоочередной задачей является эффективность 2. вектор не отсортирован 3. вектор может содержать тысячи точек. Я использую C++ и повышаю реализацию RTree. Пожалуйста, помогите мне, как я могу достичь решения
Вот код, следующий за кодом, который подсчитывает количество соседей уникальных точек в векторе. Мне нужно руководство по исключению соседей точки после их идентификации.
include set, iostream, boost/geometry.hpp, boost/geometry/geometries/point.hpp, boost/geometry/index/rtree.hpp
using namespace std;
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
typedef bg::model::point<int, 2, bg::cs::cartesian> point;
typedef std::pair<point, unsigned> value;
struct ltstr
{
bool operator()(const point &p1, const point &p2) const
{
return (p1.get < 0 >() < p2.get < 0 >() || p1.get < 1 >() < p2.get < 1 >());
}
};
void main()
{
vector<point> candidatePoints{ point(457, 184), point(457, 184), point(457, 184), point(457, 184), point(457, 184),
point(456, 184), point(456, 184), point(456, 184), point(456, 184), point(456, 184),
point(456, 184), point(457, 184), point(457, 184), point(457, 184), point(458, 184), point(459, 185) };
bgi::rtree< value, bgi::quadratic<16> > rtree;
set<point, ltstr> uniqueCandidatePoints;
for (int i = 0; i < candidatePoints.size(); ++i)
{
int x = candidatePoints[i].get < 0 >();
int y = candidatePoints[i].get < 1 >();
uniqueCandidatePoints.insert(point(x, y));
rtree.insert(make_pair(candidatePoints[i], i));
}
for (auto it = uniqueCandidatePoints.begin(); it != uniqueCandidatePoints.end(); ++it)
{
std::vector<value> returnedValues;
point currentItem = *it;
rtree.query(bgi::satisfies([&](value const& v) {return bg::distance(v.first, currentItem) < 5; }),
std::back_inserter(returnedValues));
cout << "Current Item: " << currentItem.get < 0 >() << "," << currentItem.get < 1 >() << "Count: " << returnedValues.size() << endl;
}
getchar();
}