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}

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

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

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


person user3514538    schedule 08.10.2016    source источник


Ответы (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} }
};
person Community    schedule 08.10.2016
comment
Спасибо, это работает. Но в ринге уже есть параметр Closed, что по умолчанию верно, и я думал, что это как раз для таких случаев. Игнорируется ли он алгоритмом пересечения? - person user3514538; 09.10.2016