如何从特定宽度的简单线条计算多边形点?

时间:2011-06-06 13:31:31

标签: language-agnostic line polygon openstreetmap

我目前正在开发一个从线创建多边形的应用程序,我遇到了一个小问题:

我有一组点,代表一条线。我想创建一个多边形,显示具有特定宽度的线(例如,对于街道)。我有几个想法如何计算外部多边形点,但我认为它们太复杂了......

我最好的想法是如下图所示:线的每个点必须至少投射到两个点:两个点必须与下一个线段成90°并且距离是首选多边形宽度的一半。

Highway rendering width problem

这很好用,你可以看到图中多边形的结束和起点。现在复杂的部分:用这种方法,在一个角落,每个点得到四个点。但是这些点对于外部多边形是不正确的,因为它们处于形状中。线相交并创建了一个丑陋的多边形。

如何找到这样的多边形的正确点?我认为我的方法太复杂,无法解决这个问题。

任何人都可以帮我解决这个问题(可能非常常见)吗?

信息:我用openstreetmap标记了这一点,因为像Mapnik这样的渲染器也有这个问题。

1 个答案:

答案 0 :(得分:4)

您正在寻找的是多边形(或线)偏移算法。顺便说一下,这不一定是一个容易解决的问题:An algorithm for inflating/deflating (offsetting, buffering) polygons

在过去的几周里,我一直致力于Maperitive的线偏移算法。在我的情况下,我只需要偏移该行,所以我没有寻找在其周围创建缓冲多边形的解决方案,但我想这个算法可以在将来进一步扩展: enter image description here

基本流程(粗略,但魔鬼在细节中):

  1. 对于每个折线点,找到一个与原点相距 L 的点,并且该点位于与原始线正交并穿过原点的线上。
  2. 现在通过该新点绘制一条偏移线。该行必须与原始行平行。
  3. 对于角落角度,您必须延伸两条相邻的偏移线并找到交点,这将是偏移线的下一个点。
  4. 要注意的一些事项:

    • 请注意斜接限制应用于图片右侧的凹角。
    • 在计算偏移线之前,您需要简化原始折线以排除太小而无法保持偏移的线段(结果可以在图片的中间左侧看到)。
    • 我只实现了对斜接连接的支持,但是一个好的算法也应该能够渲染圆形连接(使用弧)。
相关问题