boost :: geometry :: polygon与“有向” polyline的交点

时间:2019-05-28 11:06:24

标签: c++ boost geometry boost-geometry

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

问题是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 polyline{{0, -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)
}

enter image description here

1 个答案:

答案 0 :(得分:0)

这就是我要做的:

对折线的每个线段执行

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

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

  3. 如果在内部,则将每个具有奇数索引的交集附加到输出;

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

完成。