Как определить, находится ли линия A->B в многоугольнике, не затрагивая стены?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Как определить, находится ли линия A->B в многоугольнике, не затрагивая стены?

Сообщение Гость »

Хорошо, пристегнитесь.
Учитывая линию, состоящую из точек 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»