打包算法结果的计算尺寸(边界框)

时间:2019-07-24 12:00:35

标签: c++ algorithm packing bin-packing

我正在使用this二进制包代码。我正在使用其GrowingPacker方法。它工作正常,但是我很难弄清楚最终包装的尺寸,我的意思是像(xMin, xMax, yMin, yMax)这样的最终结果的边界框。找到它的最佳方法是什么?

我可以使用this.rootx, y, w, h的最终值来计算边界框吗?

我不确定是否正确,但是目前我正在使用类似that loop的循环来计算最终包的边界框(我正在使用C ++):

#include <cfloat> // For FLT_MAX

float minX = FLT_MAX;
float minY = FLT_MAX;
float maxW = - FLT_MAX;
float maxH = - FLT_MAX;

for (const Block &block : blocks) {

    if (block.fit) {

        if (block.fit->x < minX)
            minX = block.fit->x;

        if (block.fit->y < minY)
            minY = block.fit->y;

        if (block.fit->w > maxW)
            maxW = block.fit->w;

        if (block.fit->h > maxH)
            maxH = block.fit->h;

    }

}

1 个答案:

答案 0 :(得分:1)

要计算包含块列表中所有边界框的边界框,您需要找到最小和最大X和Y,然后使用它们来计算整个边界框的宽度和高度。

计算较小盒子的最大宽度和高度是行不通的,因为这将是各个较小盒子中最大和最大的大小,而不一定是包含所有小盒子的整体包围盒的尺寸其中

float minX = FLT_MAX;
float minY = FLT_MAX;
float maxX = - FLT_MAX;
float maxY = - FLT_MAX;

for (const Block &block : blocks) {

    if (block.fit) {

        if (block.fit->x < minX)
            minX = block.fit->x;

        if (block.fit->y < minY)
            minY = block.fit->y;

        if (block.fit->x + block.fit->w > maxX)
            maxX = block.fit->x + block.fit->w;

        if (block.fit->y + block.fit->h > maxY)
            maxY = block.fit->y + block.fit->h;

    }

}

// now that you have the min/max of x and y, calculate overall w and h:
float w = maxX > minX ? maxX - minX : 0.0f;
float h = maxY > minY ? maxY - minY : 0.0f;