几何形状的程序化分析

时间:2015-03-13 14:49:44

标签: java algorithm math geometry

我正在尝试在我正在工作的Java项目中解决数学/几何问题。

以下是该方案:

有两组块,每块都有不同数量的块和不同的尺寸。在这个例子中,Set A有5个块,每个块是20x20像素;集合B有6个块,每个块是25x50像素:

5 blocks of 20x20

我正试图想出一种数学或逻辑上确定这些集合如何排列以最大化它们之间联系的方法。如果您要将这些设置端到端排列,它将如下所示:

Four of the 25x25 blocks touch the 5 20x20 blocks

在此图像中,集合B中的4个块与集合A中的块接触。但是,如果将集合A向右移动一点,则可以触摸集合B中的5个块来触摸:

问题在于公式/算法/逻辑需要足够灵活以处理不同的组合。在此示例中,集合C只有3个块,每个块为40x40:

All 5 25x25 blocks touch the 40x40 blocks

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

将两组方块中心并将其中一组移位一小块。

答案 1 :(得分:1)

检查两组块之间的总长度差异。

  • 如果差值小于较小块的长度,则只需在一条边上对齐两组块;他们都互相联系,所以称之为好。
  • 否则,将较小的一组块向侧面移动几乎另一组的一个成员的长度(即,较大的块的长度减去一些微小的数字),以最大化接触。

它看起来有点像这样(顶部块的宽度为5,底部块的宽度为3):

111112222233333444445555566666
--->111222333444555

如果你的目标是更简单的回答“有多少块接触?”,那么计算就更简单了。较短的块组总是与较长的块组接触。如果边缘完全对齐,则较长的块组与较短的组中的这么多块接触:

(较短块的长度)/(较长块的单个成员的长度)

如果两者都小于较长的块数,则添加一个,如果该分数不是整数(考虑到我之前描述的微小偏移)。然后围捕。

答案 2 :(得分:0)

在不了解程序实际尝试做什么的情况下想出一个好的算法有点困难......但是好的,你想要“最大化”两个之间的联系< strong>列出块(或者它们真的设置了吗?)。

这里发生的一件事是,最佳对齐将使块之间至少有一个分隔符对齐。因此,您可以保持较长的列表固定,并将较短的列表移动,逐步进行分隔符对齐。

答案 3 :(得分:0)

设a_total和b_total为块集合的总宽度。设a_single和b_single为其中一个块的宽度。我们可以假设a_total&lt; = b_total(否则交换)。

如果块的行在其左边缘对齐,则A与来自B的天花板(a_total / b_single)块接触。通过将A的起点向右移动,该数量最多可以增加一个。这个数字最多只有一个,因为大B的情况是周期性的(例如,想象一个无限长的B):正好将b_single移位A导致配置与起始配置完全相同,因此添加了另一个B块结束。

现在的诀窍是看看我们是否可以通过移动A集合来添加B块,而不是在开头删除B块。

只有当B足够长时,才能在末尾添加B块;确切的条件是a_total&lt; = b_total - b_single。

如果我们可以将A集合移动少于b_single以便A集合的右边缘通过B块边界,换句话说当且仅当天花板时,我们可以避免从头开始移除B块( a_total / b_single)* b_single - a_total&lt; b_single,即ceiling(a_total / b_single)&lt; (a_total + b_single)/ b_single,即ceiling(a_total / b_single)&lt; a_total / b_single + 1.后者的不等式总是正确的。

总之,如果a_total&lt; = b_total - b_single,则联系的块数最大化(a_total / b_total)+ 1,否则最大化(a_total / b_total)(当然,假设a_total&lt; = b_total)。

还有一个问题需要考虑:当您可以通过任何实数调整块的相对位置时,上述分析成立。如果您只能进行一次像素调整,那么如果b_single = 1,则可能会遇到更多特殊情况。