эффективный способ обработки 2d сегментов линии

У меня есть огромный набор сегментов 2D-линий. Итак, я знаю; Номер строки, начало (X, Y, Z) и конец (x, Y, Z) каждого сегмента линии. Я хочу получить сегменты линии близости для данного сегмента линии. Так же для всех.

Чтобы найти близость, я могу применить это

Если я скажу, что мои данные таковы;

введите здесь описание изображенияИтак, в конце я хочу получить линии близости как вектор для каждого сегмент линии. Я слышал, что этот тип вектор вектора можно использовать со структурами данных r-дерева. Я искал его, но все еще не мог найти подходящий для меня. Также я посмотрел в opencv, там есть r-tree, но там что-то говорится о классификаторе и фазе обучения... так что, думаю, мне это не подходит.

Может ли кто-нибудь знать, как получить строку no , а затем ее соседние строки, например;

1 = {2,4,,7,66,32,12}

2 = {1,4,5,6}

3 = {...} .. .. этот тип вектора вектора с использованием r-дерева.

Я знаю, что мы можем получить этот тип векторов, используя kd-tree. Но он рассчитан на точечные данные. Итак, я думаю, что в этом случае сложно использовать kd-tree. любая помощь, пожалуйста, спасибо.


person gnp    schedule 18.03.2013    source источник


Ответы (3)


Теоретически поиск ближайших сегментов должен быть возможен с использованием любого типа пространственного индекса или структуры данных разделения пространства. Чаще всего интерфейс такого пространственного индекса позволяет хранить блоки (AABB) или точки, поэтому в этих случаях вам придется хранить ограничивающие блоки сегментов, а затем после запроса ближайших блоков снова проверять соответствующие сегменты. Однако можно индексировать сегменты напрямую. Например. в случае kd-дерева это будет версия, содержащая внутренние узлы, определяющие плоскости разделения и листы, хранящие сегменты.

Boost.Geometry R-tree поддерживает сегменты в Boost версии 1.56.0 и выше. Ниже приведен пример для 2D-сегментов с использованием этой реализации пространственного индекса:

// Required headers
#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/index/rtree.hpp>

// Convenient namespaces
namespace bg = boost::geometry;
namespace bgm = boost::geometry::model;
namespace bgi = boost::geometry::index;

// Convenient types
typedef bgm::point<double, 2, bg::cs::cartesian> point;
typedef bgm::segment<point> segment;
typedef std::pair<segment, size_t> value;
typedef bgi::rtree<value, bgi::rstar<16> > rtree;

// Function object needed to filter the same segment in query()
// Note that in C++11 you could pass a lambda expression instead
struct different_id
{
    different_id(size_t i) : id(i) {}
    bool operator()(value const& v) const { return v.second != id; }
    size_t id;
};

int main()
{
    // The container for pairs of segments and IDs
    std::vector<value> segments;
    // Fill the container
    for ( size_t i = 0 ; i < 10 ; ++i )
    {
        // Example segment
        segment seg(point(i, i), point(i+1, i+1));
        segments.push_back(std::make_pair(seg, i));
    }

    // Create the rtree
    rtree rt(segments.begin(), segments.end());
    // The number of closest segments
    size_t k = 3;

    // The container for results
    std::vector< std::vector<value> > closest(segments.size());

    for ( size_t i = 0 ; i < segments.size() ; ++i )
    {
        // Find k segments nearest to the i-th segment not including i-th segment
        rt.query(bgi::nearest(segments[i].first, k) && bgi::satisfies(different_id(i)),
                 std::back_inserter(closest[i]));
    }

    // Print the results
    for ( size_t i = 0 ; i < closest.size() ; ++i )
    {
        std::cout << "Segments closest to the segment " << i << " are:" << std::endl;
        for ( size_t j = 0 ; j < closest[i].size() ; ++j )
            std::cout << closest[i][j].second << ' ';
        std::cout << std::endl;
    }
}

Если вам нужны ВСЕ сегменты, которые ближе некоторого порога, вы можете использовать итеративные запросы (пример).

person Adam Wulkiewicz    schedule 01.08.2014

Да, R-деревья могут это делать. Они предназначены для произвольных объектов с пространственной протяженностью, не ограниченных точечными данными. На самом деле в некоторых из самых ранних примеров использовались многоугольники.

Вы пробовали их использовать?

person Has QUIT--Anony-Mousse    schedule 18.03.2013
comment
Я пытался использовать его. Но я не могу понять это с opencv. Как то, что я нашел, говорит фаза обучения и классификатор. меня, у меня нет фазы обучения .. Если вы поможете мне в этом, я очень признателен. Спасибо, - person gnp; 19.03.2013
comment
R-деревья не имеют ничего общего с классификацией. У них должна быть функция поиска ближайших соседей. Но я никогда не использовал opencv. - person Has QUIT--Anony-Mousse; 19.03.2013
comment
тогда, пожалуйста, дайте мне знать другие библиотеки, которые я могу использовать для получения этого типа ближайших соседей. Благодарность - person gnp; 19.03.2013
comment
На самом деле, я пытался использовать две ссылки ниже. Но я не смог найти способ использовать ни одну из них в моем случае. docs.opencv.org/modules/ml/doc/random_trees.html и public.cranfield.ac.uk/ c5354/teaching/ml/examples/c++/ Приветствуется любая помощь. Спасибо. - person gnp; 19.03.2013
comment
Случайный лес обычно относится к деревьям решений. Эти не R-деревья. Это нечто совершенно другое, у них мало общего, кроме использования где-то древовидной структуры данных. - person Has QUIT--Anony-Mousse; 19.03.2013
comment
Вместо этого попробуйте libspatialindex.github.com (хотя я не проверял, что он может обрабатывать пространственные объекты, а не только точки) . - person Has QUIT--Anony-Mousse; 19.03.2013

Создайте сегментную диаграмму Вороного, а затем выберите варианты близости из соседние клетки.

person n. 1.8e9-where's-my-share m.    schedule 18.03.2013