Boost.Geometry не находит вторую точку пересечения многоугольника

Я пытаюсь использовать библиотеку 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}

но он возвращает только одну точку, хотя на самом деле есть две точки пересечения

введите описание изображения здесь

Как я могу найти все точки пересечения?

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} }
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector