2015-06-26 3 views
-2

У меня есть вектор, в котором хранится список координатных точек. Я хотел бы подсчитать появление каждой точки в пределах определенного предела допуска. Допустим, что предел допуска был определен как 10 для значений X и Y. и вектор содержит {(100, 200), (110, 205), (115, 215), (120, 220), (100, 200), (150, 160)}. Теперь мой желаемый выход (100, 200) 3 (110, 205) 4 (115, 215) 3 (120220) 2 (150, 160) 1 Количествокол-во координатных точек в C++

Первая координатная 3 включает в себя (100, 200), (110, 205) {причина в том, что значение находится в пределах 100 + - 10 и 200 + - 10} и (100, 200) Здесь эффективность имеет высокий приоритет

+0

Структура данных вы, вероятно, ищет это [R-Tree] (https://en.wikipedia.org/wiki/R-tree). –

+0

спасибо за ссылку. Я думаю, это было бы идеальным решением. Открывая поиски, я обнаружил, что мне понадобится увеличить библиотеку для реализации этой структуры данных. Есть ли собственный способ сделать это в C++? – Prem

+0

Вы не * нуждаетесь * boost библиотека. C++ - это Turing-complete, вы можете использовать его для реализации чего-либо с нуля, если вы так склонны. С другой стороны, если вы не хотите внедрять все с нуля, тогда вы будете искать стороннюю библиотеку, которая будет делать то, что вам нужно, - и тогда вы, естественно, будете зависеть от указанной библиотеки и всего, что она поворот зависит от. Именно так работает разработка программного обеспечения. –

ответ

0

Я отправляю решение этой проблемы с использованием boost. Я размещаю код здесь, если кому-то понадобится аналогичное решение в будущем.

#include<set> 
    #include <iostream> 
    #include <boost/geometry.hpp> 
    #include <boost/geometry/geometries/point.hpp> 
    #include <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(); 

}

Смежные вопросы