boost :: geometry :: пересечение многоугольника и "направленной" полилинии - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно найти все точки пересечения полилинии и многоугольника, чтобы полилиния пересекала многоугольник снаружи. Я отмечал такие точки жирными точками на прикрепленной картинке.

Проблема в том, что 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 голосов
/ 28 мая 2019

Вот как я это сделаю:

Сделайте для каждого сегмента ломаной линии:

  1. получите intersection 's только этого сегмента и многоугольника;(Если нет, то continue).

  2. используйте within, чтобы проверить, находится ли стартовый терминал внутри или снаружи многоугольника;

  3. если внутри, то добавить каждое пересечение с нечетным индексом к выходу;

  4. если снаружи, тогда добавьте каждое пересечение с четным индексом (и нулем) к выходу.

Готово.

...