@PrizmMARgh

Как починить buffer из boost.geometry?

На некоторых полигонах и значениях отступа (насколько я заметил, на тех, когда один из под-полигонов схлопывается) метод 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;
}
пример некорректного и корректного вывода на одном и том же полигоне, но разном отступеё:
62f137fc6a8f5538740582.png62f1380be9eaf866198448.png62f13813c0d3d038075589.png
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы