在网格中对矩形进行分组 [英] Group rectangles in a grid

查看:86
本文介绍了在网格中对矩形进行分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个随机切片的矩形网格-宽度为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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆