在网格中组矩形

时间:2016-07-19 14:37:23

标签: javascript algorithm geometry grouping

我有一个随机切片的矩形网格 - 宽度为80个单位。

我的网格中每行的空闲空间都存储在如下所示的数组中:

[
    {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代表每个矩形的宽度。

某些数组条目相邻,即pX[i]+sX[i] = pX[i+1]。如何将这些数组条目组合在一起,得到最大相邻宽度的结果矩形?

1 个答案:

答案 0 :(得分:0)

您需要收紧阵列,连接相邻的线段。此代码( Delphi,将其视为伪代码)以所需方式收缩数组:

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