简化路径的算法

jma*_*erx 4 c++ algorithm geometry pathgeometry

给定一个路径,我想优化它,以便可以删除直线上的所有顶点.

例如:路径:

*******
*      *
*        *
***********
Run Code Online (Sandbox Code Playgroud)

可以优化为:

*-----*
|      \
|        \
*---------*
Run Code Online (Sandbox Code Playgroud)

但是我希望控制斜率的偏差,这样它就不必完全在斜率上.

什么样的算法可以做到这一点?

谢谢

tem*_*def 7

我相信你可以通过简单的迭代步行穿过路径上的点来做到这一点.在每个点跟踪您遇到的最后三个点.如果它们中的所有三个都是共线的,则从路径中移除中间点,因为从第一个节点到第三个节点的直线路径将通过中间节点.你可以控制有多少偏差,因为有一个术语可以控制点的共线距离.

如果您将点存储在数据结构(如双向链表)中,则可以在O(n)时间内通过简单的数据传递来实现.

希望这可以帮助!

  • 如果我理解这一点,当涉及偏差时,这不能按预期工作,因为每个都可以接受的多个"平滑"可能导致整体平滑,这是不再允许的.像这样的东西:第一个形成路径的一段,某种弧,其中r是弧上最远的.你测试qrs这个三元组在边界内是共线的,所以r get被删除了.然后你测试qst,这也在界限内,所以你删除s并留下q t.但是r与线qt的距离仍然可能超过平滑的极限. (2认同)