На некоторых полигонах и значениях отступа (насколько я заметил, на тех, когда один из под-полигонов схлопывается) метод buffer из boost.geometry выдаёт очевидно некорректные полигоны (см. фото). Как этого возможно избежать? Пытался добавлять 1 перед выполнением алгоритма, чтобы избежать ошибок вычисления float-а, но это не помогло. Код метода (приведение моего типа данных, применение библиотечного метода и обратное приведение):
#include "polygon.h"
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/algorithms/buffer.hpp>
#include <iostream>
#include "utils.h"
std::vector<poly> geom::buffer(const poly& P, float h) {
namespace bg = boost::geometry;
typedef bg::model::d2::point_xy<double> b_vec2;
typedef bg::model::polygon<b_vec2> b_Poly;
typedef bg::model::multi_polygon<b_Poly> b_Multi_Poly;
const int PPC = 1;
bg::strategy::buffer::distance_symmetric<double> distance_strategy(h);
bg::strategy::buffer::join_round join_strategy(PPC);
bg::strategy::buffer::end_round end_strategy(PPC);
bg::strategy::buffer::point_circle circle_strategy(PPC);
bg::strategy::buffer::side_straight side_strategy;
b_Multi_Poly Q1, P3;
std::vector<b_vec2> P1;
for(auto p : P.points) {
P1.push_back({p.x + 1.f, p.y + 1.f});
}
P1.push_back(P1[0]);
b_Poly P2;
bg::assign_points(P2, P1);
P3.push_back(P2);
bg::buffer(P3, Q1,
distance_strategy, side_strategy,
join_strategy, end_strategy, circle_strategy
);
std::vector<poly> Q2;
for(auto Q1i : Q1) {
auto er = bg::exterior_ring(Q1i);
poly Q2i;
for(u32 i = 0, n = er.size() - 1; i < n; i++) {
b_vec2 v = er[i];
Q2i.add({(float)v.x() - 1.f, (float)v.y() - 1.f});
}
Q2.push_back(Q2i);
}
return Q2;
}
пример некорректного и корректного вывода на одном и том же полигоне, но разном отступеё: