【问题标题】:Programmatic analysis of geometric shapes几何形状的程序化分析
【发布时间】:2015-03-13 14:49:44
【问题描述】:

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

这是场景:

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

我正在尝试想出一种方法来从数学或逻辑上确定这些集合如何排列以最大化它们之间的接触。如果您要将这些设置端对端排列,它会如下所示:

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

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

有什么想法吗?

【问题讨论】:

  • 嗯……图片没有上传……
  • 定义“最大化联系”。虽然我确实认为这个问题对 SO 来说太宽泛了。
  • 这2类块必须保持联系,还是可以分开?
  • 给定集合中的块是否总是相同的大小?
  • 块必须在集合中保持相同的顺序,还是需要它们重新排序以实现最大的接触?

标签: java algorithm math geometry


【解决方案1】:

将两组块居中并稍微移动其中一组。

【讨论】:

    【解决方案2】:

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

    • 如果差异小于较小块的长度,则只需将两组块对齐在一条边上;他们都有联系,所以说好。
    • 否则,将较小的一组块横向移动几乎另一组成员的长度(即较大块的长度减去一些小数),以最大限度地接触。

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

    111112222233333444445555566666
    --->111222333444555
    

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

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

    如果两者都小于较长块的数量,并且该分数不是整数,则添加一个(以考虑我之前描述的微小偏移)。然后四舍五入。

    【讨论】:

      【解决方案3】:

      如果不了解程序实际上试图做什么,想出一个好的算法有点困难......但是好的,你想“最大化”两个之间的联系列表(或者它们真的是集合?)。

      我想到的一件事是,最佳对齐方式将至少有一个块之间的分隔符对齐。所以你可以保持较长的列表固定,并移动较短的列表,按分隔符对齐。

      【讨论】:

      • 代码模拟物理对象,因此每个“组”块(如上所示)都是具有长度和宽度属性的对象数组。每个阵列中的对象需要像物理接触一样相互交互;我正在尝试最大化交互,以便涉及尽可能多的对象。
      • 好的,我们可以称之为“火车”的集合块。我认为您要求最大化通过为每个块制作一个顶点和为每个联系人制作一个边而形成的图的大小。由两列火车组成的图是一个二分图,您需要一个具有尽可能多的边的图。
      • 好的,所以再想一想,对于具有相同大小块的两列火车,当边界完全对齐时,您会得到一个森林(一组断开的图)。否则你会得到一个之字形图。当一列火车比另一列大时,您的之字形可以变成一棵树。
      【解决方案4】:

      设 a_total 和 b_total 为块集合的总宽度。让 a_single 和 b_single 成为其中一个块的宽度。我们可以假设 a_total

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

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

      只有当 B 足够长时,我们才能在末尾添加 B 块;确切的条件是 a_total

      如果我们可以将 A 集合移动小于 b_single 以使 A 集合的右边缘通过 B 块边界,我们可以避免从头开始删除 B 块,换句话说,当且仅当上限( a_total/b_single)*b_single - a_total

      总而言之,如果 a_total

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 2013-04-16
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多