C ++ R-Tree Library - 我是否必须计算bouding box?

时间:2015-09-17 10:33:18

标签: c++ r-tree

我正在尝试使用以下库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
}

1 个答案:

答案 0 :(得分:0)

维度

您对维度的要求会有一些限制。这是因为计算机只有无限存储空间,因此无法存储无限数量的维度。真的,这是一个决定你希望支持多少维度。最常见的数字当然是两个和三个。你真的需要支持十一个吗?你打算什么时候使用它?

您可以通过始终使用具有您支持的最大数量的R树,并将零作为其他坐标传递来执行此操作,或者最好是创建多个代码路径,每个支持的维数对应一个。即你会有一组二维数据的例程和另一组的三维例程,依此类推。

计算边界框

边界框是与轴对齐的矩形或长方体,完全包围您想要添加的对象。

  • 因此,如果要插入轴对齐的矩形/长方体等,则形状是边界框。
  • 如果要插入点,则每个维度的最小值和最大值只是该维度的点值。
  • 任何其他形状,您必须计算边界框。例如。如果要插入三角形,则需要计算完全围绕三角形的矩形作为边界框。

图书馆无法为您执行此操作,因为它不知道您要插入的内容。您可能正在插入存储为中心+半径的球体,或复杂的三角形网格形状。 R-Tree可以提供空间索引,但需要您提供一小部分信息来填补空白。