我正在使用this二进制包代码。我正在使用其GrowingPacker
方法。它工作正常,但是我很难弄清楚最终包装的尺寸,我的意思是像(xMin, xMax, yMin, yMax)
这样的最终结果的边界框。找到它的最佳方法是什么?
我可以使用this.root
的x, 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;
}
}
答案 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;