Учитывая линию, состоящую из точек A и B и многоугольника C, как я могу гарантировать, что линия A->B не пересекается ни с какими стенами? в C или находится внутри C?
Код: Выделить всё
#include
#include
#include
#include
#include
namespace bg = boost::geometry;
namespace bgm = boost::geometry::model;
typedef bgm::d2::point_xy Point;
typedef bgm::polygon Polygon;
typedef boost::geometry::model::segment Segment;
Polygon wall;
Polygon passage;
boost::geometry::model::linestring AB{start, end}
bool isPassable = false;
bool intersecting = bg::intersects(AB, wall);
if (intersecting) {
for (int i = 0; i < passage.outer().size(); i += 2) {
Point p1 = passage.outer()[i];
Point p2 = passage.outer()[i + 1];
Segment passageSegment(p1, p2);
Segment testSegment(start, end);
if (bg::intersects(passageSegment, testSegment)) {
isPassable = true;
break;
}
}
} else {
isPassable = bg::relate(AB, wall, boost::geometry::de9im::mask("T*F**F***"));
}
Наш многоугольник, о котором идет речь
Код: Выделить всё
POLYGON((2 2,2 3.5,4 3.5,4 2,2 3.5,2 5.5,5 5.5,5 3.5,4 2,4 3.5,5 3.5,5 5.5,7.5 5.5,7.5 2,2 2))
Код: Выделить всё
Passage: POINT(2.5 3.5) POINT(3 3.5)
Passage: POINT(4.25 3.5) POINT(4.75 3.5)
Passage: POINT(4 2.5) POINT(4 3)
Passage: POINT(5 4) POINT(5 5)
[img]https://i.stack.imgur.com /Z0JLA.png[/img]
Там, где находится зеленая линия:
Код: Выделить всё
POINT(2.5 3.25) POINT(3 3.625)

эта зеленая линия. Как видите, он лежит в многоугольнике. Итак, при первом обращении к стене оно должно вернуть true. но поскольку между линией и стенами/проходами нет никакой связи, этот возвращает false, даже несмотря на то, что этого не должно быть. Как мне с этим справиться?
В официальном документе Boost
https://live.boost.org/doc/libs/1_63_0/libs/ Geometry/doc/html/geometry/reference/algorithms/relate.html
Я вижу это

Этот метод фактически используется для того, что я хочу. Посмотрите, находится ли точка интереса в многоугольнике. но да, мы здесь.
спасибо за любую помощь.
Обновление в 1:30 утра: собираюсь спать, поэтому не могу ответить ни на одно из решений в ближайшее время. спасибо за любые попытки в комментариях. и выражаю огромную благодарность за любые решения, которые придут, пока я не проснусь.
Подробнее здесь: https://stackoverflow.com/questions/781 ... -any-walls
Мобильная версия