【问题标题】:Compute dimensions (bounding box) of packing algorithm result计算打包算法结果的维度(边界框)
【发布时间】:2019-07-24 12:00:35
【问题描述】:

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

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

我不确定它是否正确,但目前我正在使用像 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;

    }

}

【问题讨论】:

  • 您链接到的网站上的演示就是这样做的。

标签: c++ algorithm packing bin-packing


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2020-05-04
    • 2019-09-05
    • 2011-04-10
    相关资源
    最近更新 更多