Стратегии для использования с boost :: geometry :: union_ - PullRequest
2 голосов
/ 31 мая 2019

boost :: geometry :: union_ () принимает необязательный аргумент «стратегии», который описывается как «Любой тип, соответствующий концепции стратегии Union_».Мне интересно узнать, существует ли существующая стратегия, которая может помочь мне с конкретной проблемой, с которой я сталкиваюсь.Вот некоторый код:

using point_t = boost::geometry::model::d2::point_xy<double>;
using polygon_t = boost::geometry::model::polygon<point_t>;
using mpolygon_t = boost::geometry::model::multi_polygon<polygon_t>;

polygon_t obstacle1{{{-2, 7},
                     {2, 7},
                     {2, 3},
                     {-2, 3},
                     {-2, 7}}};

polygon_t obstacle2{{{-2.8284271247461903, 5},
                     {0, 7.82842712474619},
                     {2.8284271247461903, 5},
                     {0, 2.1715728752538097},
                     {-2.8284271247461903, 5}}};

polygon_t obstacle3{{{0.75, 3.0},
                     {0.75, 2.4215728752538097},
                     {0.2, 2.4215728752538097},
                     {0.75, 3.0}}};
mpolygon_t obstacles{obstacle1, obstacle2, obstacle3};

mpolygon_t consolidated;
for (auto const& obstacle : obstacles) {
    if (boost::geometry::overlaps(obstacle, consolidated)) {
        mpolygon_t temp;
        boost::geometry::union_(obstacle, consolidated, temp);
        consolidated = std::move(temp);
    } else {
        consolidated.push_back(obstacle);
    }
}

Я ожидаю, что вершины, являющиеся результатом объединения obstacle2 и obstacle3, будут коллинеарны с соответствующим ребром obstacle2.Я обнаружил, что они примерно на 1е-7 вылетели, что является большей ошибкой, чем я ожидал (в конце концов, базовый тип координат - double).

Итак, есть ли стратегия?что я могу поставить, что уменьшит ошибку, которую я вижу?

...