Я пытаюсь использовать библиотеку Boost.Geometry, чтобы найти пересечение квадрата и линии,
model::ring<model::d2::point_xy<double>> ring { {0, 0}, {2, 0}, {2, 2}, {0, 2} };
model::polygon<model::d2::point_xy<double>> pol;
pol.inners().push_back (ring);
model::linestring<model::d2::point_xy<double>> line { {1, 3}, {-1, -1} };
model::multi_point<model::d2::point_xy<double>> out;
intersection (pol, line, out); //out returns only {0.5, 2}, but not {0, 1}
но он возвращает только одну точку, хотя на самом деле есть две точки пересечения
Как я могу найти все точки пересечения?
Закройте кольцо и установите его в ожидаемом порядке (по умолчанию по часовой стрелке, увидеть параметры шаблона по умолчанию):
model::ring<model::d2::point_xy<double>> ring {
{0, 0}, {0, 2}, {2, 2}, {2, 0}, {0, 0}
};
Ваше кольцо было недействительным, т. Е. Не полностью соответствует требованиям указанных аргументов шаблона.
Согласно документации (см. В правилах) использование неверной геометрии в качестве входных данных может дать неправильные результаты, и валидность не проверяется и не корректируется алгоритмом.
Кольцо также не закрывается автоматически при строительстве или перед первым использованием (откуда ему знать, что вы не собираетесь добавлять больше очков?). Вот пример конструкции с повторяющейся точкой закрытия
Есть однако is_valid
а также correct
чтобы исправить это.
Вы также, вероятно, хотите подтолкнуть точки к внешнему кольцу, т.е. pol.outer()
, Ваш полигон должен иметь внешнее кольцо, внутренние кольца определяют отверстия. Вы можете напрямую построить многоугольник без внутренних колец:
model::polygon<model::d2::point_xy<double>> pol {
{ {0, 0}, {0, 2}, {2, 2}, {2, 0}, {0, 0} }
};
Других решений пока нет …