一个充气/排气(偏移、缓冲)折线的算法

4

相关问题:
一个将折线膨胀/缩小(平移,缓冲)成多边形的算法

不同的是我正在寻找一种方式将给定的折线膨胀成多边形:

polyline with a box around

我有以下输入:

  • 组成折线的2D点列表(在草图中为亮绿色)
  • 线条宽度

输出应该是一个多边形,显示线条扩展后的外观。

我最初认为可以使用Boost::Geometry::buffer来实现,但遗憾的是目前它只支持框。首选使用Boost::GeometryGDAL/OGR的解决方案。

更新:
我选择使用Clipper库及其OffsetPolyLines函数。一旦Boost Geometry发布带有Polyline-Buffer支持的版本,我将切换到Boost(因为我软件中的其他所有内容都使用Boost运行)。


它看起来有点像直骨架,但是过程相反。 - Cyril
2个回答

3

我知道OP更倾向于使用Boost::Geometry或GDAL/OGR来解决问题,但是如果其他人也在关注这个帖子,我的Clipper库也可以进行折线偏移。(即将发布的版本6已经在SourceForge存储库中简化了此过程,并且现在还支持开放路径(折线)剪切。)


这是我将使用的解决方案,直到 Boost 发布他们改进的缓冲算法。另外一件事:Clipper 似乎不与 Windows 兼容,因为缺少declspec(dllexport)。我添加了这些内容,在 Windows 7 上使用 VC90 和 VC100 运行一切正常。 - MOnsDaR
我承认我有点C++新手,但我认为如果您直接将源代码编译到应用程序中,则不需要使用declspec(dllexport)。您真的建议我将其包含在所有头函数中吗?另外,如果您刚开始使用Clipper,我强烈建议使用版本6(来自SF存储库),因为它是一个重大更新,特别关注支持开放路径(折线)。 - Angus Johnson
是的,我使用了SF的最新版本,OffsetPolyLines也正常工作。如果你想在Windows上创建动态库(DLL),你需要使用dllexport。对于静态库来说这不是必需的。我下周会给你发送一个补丁。 - MOnsDaR
1
OffsetPolyLines在6版本中已被替换为OffsetPaths。 - Angus Johnson

2
Boost.Geometry扩展(来自Trunk)可以实现这一点。它尚未发布。它可以在多边形、点和多几何体周围缓冲区。您可以指定锐角(角度)或圆角。它还不完美,但是像您上面的示例那样的线条不应该有任何问题。
已发布的版本(1.54)尚未具备此功能,下一个版本也没有。因此,现在您必须使用Trunk(来自SVN)。

它是否会从锐角处创建燕尾或可靠地将其剪掉? - Michael
@Barend Gehrels,您知道这个问题是否已经发布了吗? - David Doria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接