【问题标题】:Efficient algorithm for minimum trace of several line segments几条线段的最小迹线的高效算法
【发布时间】:2020-08-14 19:19:18
【问题描述】:

生成表示一组线段中最小值的一组线段的最有效算法是什么(见图)?

生成的线段应具有以下属性:

  1. 不要重叠
  2. 每个片段必须在原始集合的一个片段内
  3. 原始集的任何段上的任何点都不能落在其下方

【问题讨论】:

  • 看起来您正在寻找凸包的下半部分?尝试根据它们与水平线和连接线的角度对点进行排序?如果不是这样,请尝试在描述中更清楚。
  • @JacobSteinebronn 这不是凸包(但凸包可以满足要求)
  • 提供的结果不是一个,但根据所有限制,它看起来像一个凸包是正确的。
  • 为什么结果线没有在 X=250 和 300 之间向上移动,以跟随上面的线段?
  • @trincot。那是我的一个绘图错误。我会解决的。

标签: algorithm line computational-geometry line-intersection


【解决方案1】:

似乎是扫描线算法的理想候选者。

创建一个段端点列表,并用开始/结束标志以及对段的引用来标记它们。通过增加横坐标对列表进行排序。

现在从左到右扫描列表,同时维护一个活动的段列表。任何“开始”点都会在列表中创建一个段条目,“结束”点会丢弃它。在任何时候,活动列表都将包含在先前和当前“事件”点之间处于重叠配置中的段的子集。

通过插值,计算这些端点的坐标并垂直排序。这使您可以

  • 检测交叉点(对应于垂直列表中的重新排序),
  • 找到最低的纵坐标。

最后,您必须从左到右对交叉点进行排序,最后您将获得一个不相交且在垂直方向上按总顺序排列的子段列表。

【讨论】:

  • 对不起,我无法做出更详细的描述。如果没有完整的实施,我将无法做得更好。无论如何,我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多