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

Finding a point inside a Boost::Geometry::Polygon

我有一个 Polygon 对象,我正在寻找一种有效的方法来严格地在其中找到任何点(而不是在其边界上)。最好的方法是什么?

我有以下想法,但我不太喜欢:

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

给定一个多边形,您可以找到 第一个 两点,其中多边形 一条平行于 x 轴且位于多边形的 yMin 和 yMax(下图中的 0 和 1)。

这些点之间的任何点都将在您的多边形内。基本思想来自扫描转换多边形——即这些是您要 填写 的要点。第二点之后的线段的绕度为 0 或 2,具体取决于您的多边形。

前两个交叉点(或最后一个)必须经过,因为交叉点是沿着 x-axis.

排序的

一些角落案例:

  1. 如果您忽略刚好与直线接触的多边形的 所有 个点,在某些情况下,这可能会失败(下图)。
  2. 如果您的多边形中有重叠线,您必须解决这些问题。

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

这在大多数语言中无需使用任何特殊函数即可轻松实现。由于我不熟悉 Boost 方法,所以我在 javascript 中张贴了基本思想的草图。

绘图是使用 paper.js 完成的 — 尽管此处概述的算法代码本身是独立的。

只要你能枚举Boost::polygon

中的所有点,你就可以把它翻译成C++

这里是 demo.