【问题标题】:2D Level of Detail (LOD) algorithm2D 细节层次 (LOD) 算法
【发布时间】:2011-05-26 12:59:59
【问题描述】:

我一直在网上寻找一种算法,使您能够创建 2D 多边形的细节层次 (LOD) 表示,但我找不到任何合适的参考。也许我使用了错误的搜索词,但所有搜索结果都是针对 3D LOD 算法的,我猜这不能(?)真正应用于 2D。

我敢肯定,在 3D 图形的冲击之前,很多人会研究 2D LOD 算法。任何线索或指示我可以在哪里获得更多信息?谢谢!

【问题讨论】:

  • 有趣,也许正在寻找形状简化、图像抽象甚至压缩? LOD的要求是什么?就像图像会缩小一样?是为了性能、节省内存还是模拟深度?
  • 我正在考虑改进现有(遗留)算法的性能。本质上,我想要一个合理的多边形“收缩包装”近似值,其中主要的外部特征被保留,内部细节被隐藏起来。为建议的关键字 +1。谢谢!

标签: algorithm 2d polygon computational-geometry level-of-detail


【解决方案1】:

除了从多边形中取出每个第 N 个顶点(将顶点数减少 N)这一明显最愚蠢的算法之外,这里还有一个受一些 3D 算法启发的想法。

通常,在 3D 中,需要移除对整体体积贡献较小的面。为此,我们尝试简化模型的“最平坦”区域。

现在在 2D 中,您可以将其翻译为“简化它们之间夹角最小的线段。第一个简单的实现可能是:

  1. 计算多边形的 Si 和 Si+1 段之间的所有角度
  2. 取低于给定阈值的所有角度(或取 M 个最小的角度)
  3. 简化我们在 2 中确定的片段。(将 [Pi, Pi+1] 和 [Pi+1, Pi+2] 替换为 [Pi, Pi+2])
  4. 从 1 开始重复,直到我们充分缩小多边形

当然,这不是最优的,但它应该是质量和速度之间的良好折衷。代替角度,您可以取两条线段的中点 (Pi+1) 和可能简化的线段 ([Pi, Pi+2]) 之间的最小距离

编辑:

如果我不需要太多性能,我会尝试另一种算法:

  1. 将原始多边形顶点视为 Catmull-Rom 样条的控制点
  2. 将此样条线细分为所需的点数

最后,我在该链接上为您找到了一些源代码:http://motiondraw.com/md/as_samples/t/LineGeneralization/demo.html,以及相关的算法:http://www.geom.unimelb.edu.au/gisweb/LGmodule/LGSimplification.htm

【讨论】:

  • 感谢您的建议。我认为我将能够使用您建议的算法和上面建议的 Juraj 算法的组合来实现类似于我想要的东西。 +1。不幸的是,我无法将两个答案都标记为正确,因此将其标记为正确,但 Juraj 建议的“Douglas-Peucker 算法”同样好。
  • 是的,我不知道 Ram Douglas Peucker 算法,但我喜欢它。这样做的好处是,例如,当您达到最大点数时,您可以轻松停止。
【解决方案2】:

搜索Douglas-Peucker algorithm,它用于简化折线,但可以扩展为支持多边形。这是我用过的。如果需要,还有拓扑稳定的扩展。

【讨论】:

  • +1 让我知道这个很酷的算法。这可能有效,但我必须在我的上下文中检查它。这是我在问题中没有提到的一件事,但我不知道如何准确地用语言解释这一点,但请参阅我对上面主要问题的评论。
猜你喜欢
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多