选择瓷砖以覆盖路径的算法?

时间:2016-07-01 04:02:41

标签: algorithm language-agnostic puzzle heuristics tiling

我在地图上有一个分段的路径/路线,我的软件需要从服务器请求图像以完全覆盖路线。对服务器的图像请求只能用于矩形区域(与基本方向对齐)。简单地为路径的边界矩形请求单个大图像通常会导致下载非常大的图像,尤其是对于长路径。将它分解为几个较小的图像请求会更好,特别是对于长而曲折的路线。

但是我很难为此提出一个好的算法。有没有人知道相关的算法,或白皮书或可能有用的东西?建议?这张图片用文字解释了问题:

This image explains the problem and challenges

2 个答案:

答案 0 :(得分:0)

你有信心拥有所有细节吗?在我熟悉的系统中,信息可用的区域是平铺的,您只能请求切片,而不能请求任意地理区域。可以使用不同尺寸的瓷砖,但覆盖较小区域的瓷砖可提供更多细节,因此瓷砖尺寸的选择不取决于您要覆盖的区域,而是取决于您要显示的细节水平。如果提供数据的基础系统也是基于区块的,那么通过请求精确区块的区域可以使其生活更轻松,尽管这不会优化通信流量。这也简化了瓷砖的选择 - 您决定需要多少细节,然后请求覆盖您想要显示的区域所需的所有瓷砖。

回到你实际问过的问题,考虑一条具有恒定斜率的直线。如果将地图切割成具有给定宽度的垂直条带,则每个条带都包含一个必须提供的矩形,以便您始终可以在该线的上方和下方显示100英里的区域。因此,给定矩形宽度,您可以计算出所需的矩形高度。给定一个矩形宽度,你也可以计算出你需要多少个矩形,所以你有两个决定成本的东西 - 不同矩形的数量和矩形的总面积。通常,传输矩形的成本大致是每个矩形的固定成本和随矩形面积增长的可变成本。评估这些成本的一种方法是测量传输不同尺寸的矩形并使其适合直线所需的数据量。给定一种计算不同宽度矩形的成本的方法,我将使用一维数值最小化例程来计算出最有效的宽度。其中一个例子是https://en.wikipedia.org/wiki/Golden_section_search

答案 1 :(得分:0)

你的问题缺少一些细节,所以我会假设:

  1. 这是在一个具有宽度和高度的某种形式的屏幕上,所以当沿着路径移动时,屏幕所覆盖区域所需的最小值。
  2. 请求数量与传输的数据量无关。
  3. 所以你可以做的就是分而治之的方法。你从封闭的矩形开始。在每一步,你都要弄清楚:

    1. 矩形位于一个段的感兴趣区域内。也就是说,矩形只包含您要下载的像素。
    2. 矩形完全在感兴趣的区域之外。
    3. 与感兴趣的区域有一些重叠。
    4. 有一些重叠,但矩形足够小。
    5. 如果矩形完全进入或退出,那么它很容易,请求矩形,如果它在外面则忽略。 如果有一些重叠但矩形很小(例4)你可以下载它以便于计算。你可以去像素,但这可能有点过头了。

      棘手的情况是,如果有一些重叠并且矩形很大。在这种情况下,您将矩形划分为4个较小的矩形(每边一半),并递归调用4个较小的矩形。一个很小的优化:如果算法决定完全取出所有4个较小的算法,你应该取较大的那个而不是4个小的。

      要确定包含重叠,您可以获取路径的每个部分,并且每个路径都将视图矩形放在每个端部,链接相应的角并采用凸包。然后计算凸包与您正在测试的矩形的交点/重叠。

      虽然这看起来有点复杂但它应该能够很好地覆盖一堆极端情况(如非常小的路径段或自相交路径)。