C++ 边界框的空间散列

C++ 边界框的空间散列,c++,hash,C++,Hash,我有一个计算空间散列的函数,如下所示: int generateHash(int x, int y, int bucketWidth, int bucketsPerSide) { return static_cast<int>(floor(x / bucketWidth) + floor(y / bucketWidth) * bucketsPerSide); } int generateHash(int x,int y,int bucketWidth,int buckets

我有一个计算空间散列的函数,如下所示:

int generateHash(int x, int y, int bucketWidth, int bucketsPerSide)
{
    return static_cast<int>(floor(x / bucketWidth) + floor(y / bucketWidth) * bucketsPerSide);
}
int generateHash(int x,int y,int bucketWidth,int bucketsPerSide)
{
返回静态铸件(地板(x/bucketWidth)+地板(y/bucketWidth)*bucketsPerSide);
}
我有一个定义为x,y,width,height的边界框,我想检索它的所有哈希值。我怎么做?这个问题似乎微不足道,但我花了一整天的时间试图解决它,但我就是找不到解决办法。这让我感到绝望

请注意,该框可能太大,以至于分配给它的哈希(角点)超过4个。我需要生成所有散列,包括其中的散列

哑解决方案是从x和y开始,在嵌套循环中以1递增,然后添加到std::set,以确保每个哈希只出现一次,但这是非常低效的。我知道一定有更好的办法。我尝试通过bucketWidth递增,但在某些情况下,它不会为最右边生成哈希

我得到的最接近的结果是:

std::vector<int> getOccupiedBucketIds(const cv::Rect& rect)
{
    std::vector<int> occupiedBucketIds;
    auto xIncrement = rect.width < bucketWidth  ? rect.width : bucketWidth ;
    auto yIncrement = rect.height < bucketWidth ? rect.height : bucketWidth ;

    for (auto x = rect.x; x <= rect.x + rect.width; x += xIncrement)
    {
        for (auto y = rect.y; y <= rect.y + rect.width; y += yIncrement)
        {
            occupiedBucketIds.push_back(generateHash(x, y, bucketWidth , cellsPerSide));
        }
    }
    return occupiedBucketIds;
}
std::vector getOccupiedBucketIds(const cv::Rect&Rect)
{
std::载体占据的球茎;
auto xIncrement=rect.width对于(auto x=rect.x;x您需要这样的内容:

std::vector<hash_t> hashes;
for(double yi=y+bucket_width/2;yi<ymax;yi+=bucket_width)
for(double xi=x+bucket_width/2;xi<xmax;xi+=bucket_width)
  hashes.push_back(generateHash(xi,yi,bucket_width,buckets_per_side));
std::向量散列;

例如,我的一个朋友帮我解决了这个问题。就像我说的,这有点琐碎

std::vector<int> getOccupiedBucketIds(const cv::Rect& rect)
{
    auto minBucketX = rect.x / bucketWidth;
    auto minBucketY = rect.y / bucketWidth;
    auto maxBucketX = (rect.x + rect.width) / bucketWidth;
    auto maxBucketY = (rect.y + rect.height) / bucketWidth;

    std::vector<int> occupiedBucketIds;
    occupiedBucketIds.reserve((maxBucketX - minBucketX + 1) * (maxBucketY - minBucketY + 1));
    for (auto y = minBucketY; y <= maxBucketY; y++)
    {
        for (auto x = minBucketX; x <= maxBucketX; x++)
        {
            occupiedBucketIds.push_back(y * cellsPerSide + x);
        }
    }
    return occupiedBucketIds;
}
std::vector getOccupiedBucketIds(const cv::Rect&Rect)
{
auto minBucketX=rect.x/bucketWidth;
auto minBucketY=rect.y/bucketWidth;
auto maxBucketX=(矩形x+矩形宽度)/bucketWidth;
auto maxBucketY=(矩形y+矩形高度)/bucketWidth;
std::载体占据的球茎;
占用BucketId.储量((maxBucketX-minBucketX+1)*(maxBucketY-minBucketY+1));

对于(auto y=minBucketY;y你所说的xmax是什么意思?rect.x+rect.width?现在它没有得到最左边的角点。也许只需知道每个角点的散列值,就可以用整数算法来解决这个问题?例如,左上角和右上角散列值之间的差是用占用的桶数表示的宽度。我不知道怎么做很遗憾,帽子代表高度。@MaxWalczak:你说的
xmax
是什么意思?谢天谢地,自从我提供了上述答案以来,你的问题增加了更多的内容,所以我很有信心它应该
rect.x+rect.width
。关于最左边角的问题,你是否尝试过从初始值中减去,例如de>yi=y-bucket_-width/2
?由于您使用的是楼层功能,所以最左边的角落会被忽略似乎很奇怪。是的。不幸的是,这也不起作用。它总是从x开始在左侧生成一个额外的行和列,y@MaxWalczak:我不确定整数运算是否有效。你说的是“散列”在你的问题中,但是散列通常会在很大范围内随机分布输入。如果你想给桶排序,也许最好将你的函数称为生成“网格索引”。如果您使用的是网格索引,则可以使用简单的算术,但仍需要考虑浮点问题。没有理由要求高度的计算结果与宽度的计算结果明显不同。