我正在尝试使用以下库here (the templated version),但在库中显示的示例中,用户定义了边界框。在我的问题中,我每次都有未知维数的数据,所以我不知道如何使用它。除此之外,每次插入时,R-Tree是否都不能计算边界框?
这是库的示例代码,因为您可以看到用户每次都定义了边界框:
snappy.compress() x 479 ops/sec ±0.99% (80 runs sampled)
zlib.gzip() x 289 ops/sec ±1.66% (86 runs sampled)
snappy.uncompress() x 652 ops/sec ±0.86% (43 runs sampled)
zlib.gunzip() x 559 ops/sec ±1.65% (64 runs sampled)
我想在R-Tree中保存的一个例子是:
#include <stdio.h>
#include "RTree.h"
struct Rect
{
Rect() {}
Rect(int a_minX, int a_minY, int a_maxX, int a_maxY)
{
min[0] = a_minX;
min[1] = a_minY;
max[0] = a_maxX;
max[1] = a_maxY;
}
int min[2];
int max[2];
};
struct Rect rects[] =
{
Rect(0, 0, 2, 2), // xmin, ymin, xmax, ymax (for 2 dimensional RTree)
Rect(5, 5, 7, 7),
Rect(8, 5, 9, 6),
Rect(7, 1, 9, 2),
};
int nrects = sizeof(rects) / sizeof(rects[0]);
Rect search_rect(6, 4, 10, 6); // search will find above rects that this one overlaps
bool MySearchCallback(int id, void* arg)
{
printf("Hit data rect %d\n", id);
return true; // keep going
}
void main()
{
RTree<int, int, 2, float> tree;
int i, nhits;
printf("nrects = %d\n", nrects);
for(i=0; i<nrects; i++)
{
tree.Insert(rects[i].min, rects[i].max, i); // Note, all values including zero are fine in this version
}
nhits = tree.Search(search_rect.min, search_rect.max, MySearchCallback, NULL);
printf("Search resulted in %d hits\n", nhits);
// Iterator test
int itIndex = 0;
RTree<int, int, 2, float>::Iterator it;
for( tree.GetFirst(it);
!tree.IsNull(it);
tree.GetNext(it) )
{
int value = tree.GetAt(it);
int boundsMin[2] = {0,0};
int boundsMax[2] = {0,0};
it.GetBounds(boundsMin, boundsMax);
printf("it[%d] %d = (%d,%d,%d,%d)\n", itIndex++, value, boundsMin[0], boundsMin[1], boundsMax[0], boundsMax[1]);
}
// Iterator test, alternate syntax
itIndex = 0;
tree.GetFirst(it);
while( !it.IsNull() )
{
int value = *it;
++it;
printf("it[%d] %d\n", itIndex++, value);
}
getchar(); // Wait for keypress on exit so we can read console output
}
答案 0 :(得分:0)
您对维度的要求会有一些限制。这是因为计算机只有无限存储空间,因此无法存储无限数量的维度。真的,这是一个决定你希望支持多少维度。最常见的数字当然是两个和三个。你真的需要支持十一个吗?你打算什么时候使用它?
您可以通过始终使用具有您支持的最大数量的R树,并将零作为其他坐标传递来执行此操作,或者最好是创建多个代码路径,每个支持的维数对应一个。即你会有一组二维数据的例程和另一组的三维例程,依此类推。
边界框是与轴对齐的矩形或长方体,完全包围您想要添加的对象。
图书馆无法为您执行此操作,因为它不知道您要插入的内容。您可能正在插入存储为中心+半径的球体,或复杂的三角形网格形状。 R-Tree可以提供空间索引,但需要您提供一小部分信息来填补空白。