используя функцию boost::geometry::buffer

Я впервые использую библиотеки boost, поэтому мне это очень некомфортно, и я могу делать что-то не так. У меня возникают проблемы при использовании функции boost::geometry::buffer().

Вот мой код:

#include <vector>
#include <boost\geometry.hpp>
#include <boost\geometry\geometries\register\point.hpp>

struct PNT_2D
{
    double x, y;
};
BOOST_GEOMETRY_REGISTER_POINT_2D(PNT_2D, double, boost::geometry::cs::cartesian, x, y);
typedef boost::geometry::model::polygon<PNT_2D, false>  BoostPolygon;
typedef std::vector<PNT_2D>                             StlPolygon;

int main(int argc, char * argv[])
{
    int             nStaph;
    BoostPolygon    polygon;
    BoostPolygon    off_polygon;
    PNT_2D          p2dPunto;
    StlPolygon      stlPolygon;

    stlPolygon.resize(5);
    stlPolygon[0].x = stlPolygon[0].y = stlPolygon[4].x = stlPolygon[4].y =  0.0;
    stlPolygon[1].x = 25.0; stlPolygon[1].y = 0.0;
    stlPolygon[2].x = 25.0; stlPolygon[2].y = 25.0;
    stlPolygon[3].x = 0.0; stlPolygon[3].y = 25.0;
    boost::geometry::append(polygon, stlPolygon);
    boost::geometry::buffer(polygon, off_polygon, 1);
    stlPolygon = off_polygon.outer();
    for (auto punto = stlPolygon.begin(); punto != stlPolygon.end(); punto++)
        std::cout << "(" << punto->x << ", " << punto->y << ")" << std::endl;
}

что дает следующую ошибку при компиляции:

'int boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)': impossibile convertire l'argomento 1 da 'boost::mpl::failed ************(__thiscall boost::geometry::nyi::not_implemented_error<boost::geometry::info::POLYGON,boost::geometry::info::POLYGON,void>::THIS_OPERATION_IS_NOT_OR_NOT_YET_IMPLEMENTED::* ***********)(boost::mpl::assert_::types<Term1,Term2,Term3,boost::mpl::na>)' a 'boost::mpl::assert<false>::type'

Что мне не хватает?

ИЗМЕНИТЬ

Я обновил свой код следующим образом:

//////////////////////// DEFINITIONS
typedef BG::model::polygon<PNT_2D, false> BoostPolygon;
typedef BG::model::multi_polygon<BoostPolygon> BoostMultiPolygon;
typedef SB::distance_symmetric<double> DistanceStrategy;
typedef SB::end_round EndStrategy;
typedef SB::join_round JoinStrategy;
typedef SB::point_circle PointStrategy;
typedef SB::side_straight SideStrategy;
typedef std::vector<PNT_2D> StlPolygon;
/////////////////////////////////////////////////////////////

///////////////////////// CODE
BoostMultiPolygon   off_polygon;
BoostPolygon        polygon;
DistanceStrategy    distance_strategy(1.0);
EndStrategy     end_strategy;
JoinStrategy        join_strategy;
PointStrategy       point_strategy;
PNT_2D          p2dPunto;
SideStrategy        side_strategy;
StlPolygon      stlPolygon;

p2dPunto.x = p2dPunto.y = 0.0;
boost::geometry::append(polygon, p2dPunto);
p2dPunto.x = 25.0; p2dPunto.y = 0.0;
boost::geometry::append(polygon, p2dPunto);
p2dPunto.x = 25.0; p2dPunto.y = 25.0;
boost::geometry::append(polygon, p2dPunto);
p2dPunto.x = 0.0; p2dPunto.y = 25.0;
boost::geometry::append(polygon, p2dPunto);
p2dPunto.x = 0.0; p2dPunto.y = 0.0;
boost::geometry::append(polygon, p2dPunto);
boost::geometry::buffer(polygon, off_polygon, distance_strategy, side_strategy, join_strategy, end_strategy, point_strategy);
for (auto poligono = off_polygon.begin(); poligono != off_polygon.end(); poligono++)
{
    for (auto punto = poligono->outer().begin(); punto != poligono->outer().end(); punto++)
        std::cout << "(" << punto->x << ", " << punto->y << ")" << std::endl;
}
std::cin >> nStaph;

return EXIT_SUCCESS;

И теперь у меня есть эта ошибка:

'std::copy::_Unchecked_iterators::_Deprecate': Call to 'std::copy' with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'

Not in the main project, but in xutility.

person IssamTP    schedule 08.03.2019    source источник


Ответы (1)


  • Код, который вы представляете, предназначен для буферизации поля. Для буфера с полигоном вам (в настоящее время) необходимо использовать стратегии буфера со стратегиями (см. doc с примером)
  • Если вы сделаете это и предоставите стратегии, результатом должен быть мультиполигон.
  • Ваш образец эффективно использует коробку, так что это тоже может быть вариантом. Но тогда ваша входная геометрия должна соответствовать концепции коробки
person Barend Gehrels    schedule 08.03.2019
comment
Привет, спасибо за ответ, я обновил вопрос с новым кодом и новой ошибкой. - person IssamTP; 11.03.2019
comment
Ответ в сообщении: Чтобы отключить это предупреждение, используйте -D_SCL_SECURE_NO_WARNINGS. - person Barend Gehrels; 13.03.2019
comment
Я догадался, на самом деле я решил таким образом, но я чувствую себя неловко с этим, просто интересно, есть ли другой. - person IssamTP; 19.03.2019