在Boost :: Geometry :: Polygon中找到一个点

时间:2016-01-09 13:58:55

标签: c++ boost computational-geometry boost-geometry

我有一个Polygon对象,我正在寻找一种有效的方法来查找严格位于其中的任何点(不在其边界上)。这样做的最佳方式是什么?

我有以下想法,我不是很喜欢:

  1. 对多边形进行三角测量并在其中一个三角测量边缘上报告一个点(太贵)。
  2. 检查多边形的缠绕方向并报告位于距离多边形之一的ε距离内的点(在边缘情况下不起作用)。

1 个答案:

答案 0 :(得分:4)

给定一个多边形,你可以找到第一个两个点,其中多边形穿过一条平行于x轴的线,位于yMin&之间。多边形的yMax(下图中为0& 1)。

这些点之间的任何点都在多边形内。基本思想来自扫描转换多边形-i.e.这些是你填充的要点。第二个点之后的线部分的绕组为0或2,具体取决于您的多边形。

必须采用前两个交叉点(或最后一个),因为交叉点沿x轴排序。

Basic idea

一些角落案例:

  1. 如果省略多边形的所有点,这些点只会触及该线,在某些情况下,这可能会失败(图片如下)。
  2. 如果多边形中有重叠的线条,则必须解决这些问题。
  3. issue

    为了避免第一个问题,请确保将第一个点作为明确的交叉点,下一个点可以是交叉点或多边形刚接触线的点。

    final

    这可以在不使用大多数语言的任何特殊功能的情况下轻松实现。由于我不熟悉Boost方法,我在javascript中发布了基本思想的草图。

    使用 paper.js 完成绘图 - 尽管此处概述的算法代码本身是自包含的。

    只要您可以枚举Boost :: polygon中的所有点,就可以将其转换为C ++

    这是demo