C++2D排版,指定间隔,以左下角对齐,返回位置,利用率最高的排版,源码
时间: 2024-03-01 21:53:35 浏览: 101
基于C++版本,异型和矩形优化排版算法工具代码,优化率高,优化时间短
5星 · 资源好评率100%
以下是一个更高级的C++2D排版代码示例,可以实现指定间隔,以左下角对齐,并返回下一个位置的功能,同时优化了利用率:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义一个结构体表示每个元素的位置和大小
struct Element {
int x, y, width, height;
bool placed; // 表示元素是否已经放置
};
// 2D排版函数
vector<Element> layout(vector<Element>& elements, int gap) {
// 先按照高度从大到小排序,这样可以优化利用率
sort(elements.begin(), elements.end(), [](const Element& a, const Element& b) {
return a.height > b.height;
});
// 计算每一列的宽度和高度
vector<int> col_widths(elements.size(), 0);
vector<int> col_heights(elements.size(), 0);
int max_x = 0, max_y = 0;
for (int i = 0; i < elements.size(); i++) {
Element& e = elements[i];
int col = 0, min_height = col_heights[0];
// 找到高度最小的列
for (int j = 0; j < col_heights.size(); j++) {
if (col_heights[j] < min_height) {
col = j;
min_height = col_heights[j];
}
}
// 更新元素位置和列高度
e.x = col_widths[col];
e.y = col_heights[col];
col_widths[col] += e.width + gap;
col_heights[col] += e.height + gap;
// 更新max_x和max_y
max_x = max(max_x, e.x + e.width);
max_y = max(max_y, e.y + e.height);
// 标记元素已经放置
e.placed = true;
}
// 返回排版后的元素数组
vector<Element> result;
for (int i = 0; i < elements.size(); i++) {
if (elements[i].placed) {
result.push_back(elements[i]);
}
}
return result;
}
int main() {
// 创建一些元素
vector<Element> elements = {
{0, 0, 10, 20},
{0, 0, 30, 40},
{0, 0, 20, 30},
{0, 0, 15, 15},
{0, 0, 25, 25},
};
// 进行排版
int gap = 5;
vector<Element> result = layout(elements, gap);
// 输出结果
for (int i = 0; i < result.size(); i++) {
Element& e = result[i];
cout << "Element " << i << ": (" << e.x << ", " << e.y << ")" << endl;
}
return 0;
}
```
这个示例中,我们首先按照元素的高度从大到小排序,这样可以优化利用率。然后,我们使用一个数组来记录每一列的宽度和高度,并在每次放置元素时更新这些数组。最终,我们返回排版后的元素数组,并输出每个元素的位置。
这个示例相对于之前的示例,增加了列的概念,将元素按列排列,可以更好地利用空间。同时,我们使用了一个`placed`标记来标记已经放置的元素,避免重复放置元素。
阅读全文