在网格中对矩形进行分组 [英] Group rectangles in a grid
问题描述
我有一个随机切片的矩形网格-宽度为80单位。
I have a randomly-sliced rectangular grid - width is 80 unit.
我已经将网格的每一行的可用空间存储在这样的数组中
I already have the free spaces of each row of my grid stored in an array like this below:
[
{pX:1,sX:15},
{pX:30,sX:13},
{pX:43,sX:1},
{pX:44,sX:17}
],
[
{pX:1,sX:15},
{pX:16,sX:14},
{pX:30,sX:13},
{pX:43,sX:1},
{pX:44,sX:17}
]
其中pX是起始点和sX代表每个矩形的宽度。
where pX is the starting point and sX represent the width of each rectangle.
一些数组项是相邻的,即 pX [i] + sX [i] = pX [i + 1]
。如何将这些数组条目组合在一起,并得到具有最大相邻宽度的结果矩形?
Some of the array entries are adjacent, i.e. pX[i]+sX[i] = pX[i+1]
. How can i group these array entries together and get the resulting rectangles with the maximum adjacent width?
推荐答案
您需要收紧数组,连接相邻的线段。这段代码( Delphi,将其视为伪代码)以所需的方式缩小数组:
You need to tighten arrays, joining adjacent segments. This code (Delp consider it as pseudocode) shrinks arrays in needed manner:
var
pX, sX: TArray<Integer>;
i, removed: Integer;
begin
pX := [1, 30, 43, 44, 64, 66, 69, 72];
sX := [15, 13, 1, 17, 2, 2, 3, 5];
removed := 0;
for i := 1 to High(pX) do begin
if (pX[i - removed - 1] + sX[i - removed - 1] = pX[i]) then
begin ////join neighbors
sX[i - removed - 1] := sX[i - removed - 1] + sX[i];
Inc(removed); ////removed++
end
else
if (removed > 0) then
begin ////copy to new place
pX[i - removed] := pX[i];
sX[i - removed] := sX[i];
end;
end;
////shorten array, remove tail
SetLength(px, Length(pX) - removed);
SetLength(sX, Length(sX) - removed);
////output result
Memo1.Lines.Add(ArrayToString(pX));
Memo1.Lines.Add(ArrayToString(sX));
输出
1 30 64 69
15 31 4 8
这篇关于在网格中对矩形进行分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!