C++ 处理二维线段的有效方法

C++ 处理二维线段的有效方法,c++,data-structures,kdtree,r-tree,C++,Data Structures,Kdtree,R Tree,我有大量的二维线段。所以,我知道;行号, 每条线段的起点(X,Y,Z)和终点(X,Y,Z)。我想去 给定线段的接近线段。所有人都是如此 为了找到我可以申请的距离 如果我说我的数据是 因此,在末尾,我想得到接近线作为每个线段的向量。我听说这种类型的向量可以用r-树数据结构表示。我正在搜索它,但仍然找不到适合我的。我在opencv中也看到了,有一个r树,但它说明了一些关于分类器和训练阶段的内容。。。所以,我想它不适合我 任何人都知道如何获得行否,然后它的相邻行为ex 1={2,4,7,66,32,

我有大量的二维线段。所以,我知道;行号, 每条线段的起点(X,Y,Z)和终点(X,Y,Z)。我想去 给定线段的接近线段。所有人都是如此

为了找到我可以申请的距离

如果我说我的数据是

因此,在末尾,我想得到接近线作为每个线段的向量。我听说这种类型的向量可以用r-树数据结构表示。我正在搜索它,但仍然找不到适合我的。我在opencv中也看到了,有一个r树,但它说明了一些关于分类器和训练阶段的内容。。。所以,我想它不适合我

任何人都知道如何获得行否,然后它的相邻行为ex

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

2={1,4,5,6}

3={…}。。 这类向量的向量使用r-树

我知道,我们可以用kd树得到这种类型的向量。但它是为点数据设计的。所以,我认为在这种情况下很难使用kd树。
请提供帮助,谢谢。

构建一个,然后从相邻单元中获取邻近候选。

是的,R-trees可以做到这一点。它们是为具有空间扩展的任意对象而设计的,不限于点数据。实际上,一些最早的例子使用了多边形


您尝试过使用它们吗?

理论上,使用任何类型的空间索引或空间分区数据结构都可以搜索最近的段。通常,这种空间索引的接口允许存储框(AABB)或点,因此在这些情况下,您将被迫存储段的边界框,然后在查询最近的框后再次检查相应的段。但是,可以直接为段编制索引。例如,在kd树的情况下,它将是一个包含内部节点的版本,这些节点定义了分割平面和存储段的叶子

R-tree支持1.56.0及更高版本中的段。以下是使用此空间索引实现的二维线段示例:

// 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;
    }
}
//所需的标题
#包括
#包括
#包括
#包括
#包括
//方便的名称空间
名称空间bg=boost::geometry;
名称空间bgm=boost::geometry::model;
名称空间bgi=boost::geometry::index;
//方便类型
typedef bgm::point;
typedef-bgm::段段;
typedef std::对值;
typedef-bgi::rtree-rtree;
//筛选查询()中相同段所需的函数对象
//注意,在C++11中,可以传递lambda表达式
结构不同的\u id
{
不同的id(大小i):id(i){
bool运算符()(值const&v)const{return v.second!=id;}
尺寸标识;
};
int main()
{
//段和ID对的容器
std::向量段;
//把容器装满
对于(尺寸i=0;i<10;++i)
{
//示例段
分段分段(点(i,i),点(i+1,i+1));
段。向后推(标准::生成对(seg,i));
}
//创建rtree
rtree-rt(segments.begin(),segments.end());
//最近的段数
尺寸k=3;
//结果的容器
std::vector最近的(segments.size());
对于(size_t i=0;istd::我可以试着使用它。但我无法用opencv解决它。正如我发现的东西所说的训练阶段和分类器。我,我没有训练阶段。如果你能在这方面指导我,我真的很感激。谢谢你,R树与分类无关。它们应该有一个“查找最近邻居”的功能函数。但我从未使用过opencv。那么,请让我知道我可以使用的其他库来获取这种类型的近邻。谢谢,实际上,我尝试使用以下两个链接。但是,对我来说,我找不到一种方法来使用这两个链接。非常感谢您提供的任何帮助。随机林通常指决策树。这些它们不是R-树,而是完全不同的东西,它们除了在某个地方使用类似树的数据结构外,几乎没有什么共同点。