【问题标题】:What is the best algorithm to visually separate overlapping vehicles in close proximity on a map?在地图上视觉上分离重叠车辆的最佳算法是什么?
【发布时间】:2011-04-25 02:43:16
【问题描述】:

我正在寻找一种算法,该算法可以让我在大量车辆列表中直观地分离出任意两到四辆车辆,这些车辆在地图上靠得足够近,以至于它们相互遮挡。我需要过滤掉超过四辆车的情况,因为这些车辆会大量聚集在某些区域,在这些情况下将它们分开并不重要。该算法还应该标记已经处理过的车辆。

在我的问题空间中,知道车辆存在并能够看到有关它们的信息比获得关于它们所在位置的绝对准确信息更重要。

我们的想法是增加大约 10 码(考虑到正在使用的地图比例),以便可以看到个别车辆,而不是被附近的其他车辆遮挡。

我已经想到了几种方法来做到这一点,但考虑到这里答案的质量以及有人可能已经这样做了,我想我会发布这个问题。

我正在添加当前显示的图像,以帮助澄清建议的 cmets 之一(好吧,这不是图表,但这是实际显示给用户的内容)。

一些答案​​需要更改用于指示给定位置有多少车辆(高尔夫球车)的视觉队列。我不想改变用户在视觉上的期望,而必须向用户解释其含义是什么。使用正方形的答案最接近我所寻找的,但这只是视觉部分。我还在寻找如何最好地遍历列表的算法,以查找彼此相距 n(比如说 5)码内的 2 到 4 辆高尔夫球车组,同时忽略更大的分组(车谷仓、小吃店等)。图标上的数字与购物车编号相对应。

此应用程序还允许用户放大/缩小地图,以便进一步缩小地图,汽车之间需要更大的距离,以便它们在视觉上不会重叠。

请注意,图片中的 78 和 62 号车遮挡了后面的车。

【问题讨论】:

  • 你能描述得更详细些吗?图表会很棒。

标签: c# algorithm


【解决方案1】:

Google 术语是label placement。一般来说,这本身就是一个完整的研究领域,没有真正好的通用解决方案,但对于像这样的特定场景,有几个合适的实现。 Wikipedia/Automatic label placement 也是一个很好的起点。

根据您的图像,您希望很少有重叠标签,那么您可以选择一种针对速度优化的简单贪心算法。

【讨论】:

    【解决方案2】:

    我想我会很想将每辆车渲染为一个点(无论它们是否靠近)。在点上方,我会绘制车辆名称标签(为了便于阅读,您可以在标签后面绘制不透明或半透明的背景,或者以对比色为标签边框)。

    对于距离很近的车辆,我会绘制一个较大的点,并在上面列出名称列表,否则,如果这使地图或其他车辆模糊不清,则从点发出一条线到一个较小的接线盒地图的突出部分,带有名称列表。

    例如:

                                 V66
                   V12           V07
    V23             ·            V22
     ·                            •
              V78             •
               ·              |
                           +-----+
                           | V09 |
                           | V34 |
                           +-----+
    

    【讨论】:

      【解决方案3】:

      正方形似乎是一个不错的选择,因为您不必担心超过四辆车的实例。

      我会取“重叠”附近的所有车辆的平均位置,并将其设置为正方形的“中心”,长度和宽度足够大,以便将车辆放在每个角落不会导致任何重叠。

      然后,我将从左上角的 0 号车辆开始,逆时针绕过正方形的拐角,将下一辆车添加到下一个拐角。

      简单而有效,假设没问题(从你的帖子看来是这样?)你会失去一些准确性。这就是我会做的。

      【讨论】:

        【解决方案4】:

        执行此操作的常用方法是使用备用标记。如果您常用的标记是图钉图像,请使用顶部带有 2 的图钉用于同一位置的两个项目。另一种方法是将第一个标记放在确切的位置,然后将后面的标记放在“下一个”以定义“下一个”。对于您的车辆示例:将第二个放在道路上的某个距离,鉴于当前的比例,确保视觉分离。用于测试是否使用备用放置的排除矩形现在被拉长以覆盖第二个标记,这样当放置第三辆车时,它将被放置在前两个标记的后面。

        【讨论】:

          猜你喜欢
          • 2022-10-15
          • 2014-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-04
          • 2010-12-13
          • 1970-01-01
          • 2020-05-18
          相关资源
          最近更新 更多