boost::geometry::Polygon 和“有向”折线的交集

Posted

技术标签:

【中文标题】boost::geometry::Polygon 和“有向”折线的交集【英文标题】:boost::geometry::intersection of Polygon and "directed" Polyline 【发布时间】:2019-05-28 11:06:24 【问题描述】:

我需要找到折线和多边形的所有交点,以便折线从外部与多边形相交。我在所附图片上用粗点标记了这些点。

问题是 boost::geometry::intersection 返回所有交点,我需要以某种方式检查交点类型。

这里是一些使用boost::geometry::intersection的小例子:

BOOST_GEOMETRY_REGISTER_POINT_2D(Eigen::Vector2d, double, cs::cartesian, x(), y())
BOOST_GEOMETRY_REGISTER_POINT_3D(Eigen::Vector3d, double, cs::cartesian, x(), y(), z())
BOOST_GEOMETRY_REGISTER_LINESTRING(std::vector<Eigen::Vector2d>)
BOOST_GEOMETRY_REGISTER_MULTI_LINESTRING(std::vector<std::vector<Eigen::Vector2d>>)

using Point = Eigen::Vector2d;
using Polyline = std::vector<Point>;
using Polygon = boost::geometry::model::polygon<Point>;

Polyline polyline0, -10, 0, 10;

Polygon polygon;
std::vector<Point> polygon_points-1., 1., 1., 1., 1, -1, -1, -1, -1, 1;
boost::geometry::assign_points(polygon, polygon_points);

std::vector<Point> intersection_points;

boost::geometry::intersection(polygon, polyline, intersection_points);

for (const auto& p : intersection_points) 
  std::cout << p << std::endl << std::endl; //  here we have 2 points, but I need only one (0, -1)

【问题讨论】:

【参考方案1】:

这就是我的做法:

对折线的每一段做:

    仅获取此段的intersection 和多边形; (如果没有则continue)。

    使用within检查起始终端是在多边形内部还是外部;

    如果在内部,则将每个带有奇数索引的交叉点附加到输出;

    如果在外部,则将带有偶数索引(和零)的每个交集附加到输出。

完成。

【讨论】:

您的想法是基于intersects 返回的交叉点已排序。但是intersects 能保证这一点吗?

以上是关于boost::geometry::Polygon 和“有向”折线的交集的主要内容,如果未能解决你的问题,请参考以下文章