【问题标题】:Group rectangles in a grid在网格中分组矩形
【发布时间】:2016-07-19 14:37:22
【问题描述】:

我有一个随机切片的矩形网格 - 宽度为 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]。如何将这些数组条目组合在一起并获得具有最大相邻宽度的结果矩形?

【问题讨论】:

  • 你能发布想要的输出吗?
  • @NenadVracar: [{pX:1,sX:15},{pX:30,sX:31}],[{pX:1,sX:60}]

标签: javascript algorithm geometry grouping


【解决方案1】:

您需要收紧阵列,连接相邻的段。此代码(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 

【讨论】:

  • 是的!!! “收紧”,而不是“加入”才是正道!非常感谢 TurboPascal-time 的推介。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2011-08-14
相关资源
最近更新 更多