Поворот многоугольника с использованием геометрии повышения

Я пытаюсь повернуть многоугольник, используя геометрию повышения. Наверное, я делаю что-то не так. У меня есть многоугольник, не центрированный в начале координат, объявленный следующим образом:

Polygon _poly;
Polygon _poly2;

  Point2D A(4,3);
  Point2D B(4,5);
  Point2D C(6,5);
  Point2D D(6,3);
  Point2D CLOSE(4,3);


  _poly.outer().push_back(A);
  _poly.outer().push_back(B);
  _poly.outer().push_back(C);
  _poly.outer().push_back(D);

Затем я выполняю вращение с помощью:

  boost::geometry::strategy::transform::rotate_transformer<boost::geometry::degree, double, 2, 2> rotate(45.0);

Но полученные координаты многоугольника не правильные:

координаты полигона: 4 3 4 5 6 5 6 3

повернутые координаты: 4 0 6 0 7 0 6 -2

Что я должен сделать?


person user3018940    schedule 28.06.2015    source источник


Ответы (1)


Ваш полигон недействителен (см. документацию). Это легко проверить с помощью is_valid.

Если вы не знаете источник ввода, вы всегда можете попытаться исправить это с помощью boost::geometry::correct:

Жить на Coliru

#include <iostream>

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/algorithms/is_valid.hpp>
#include <boost/geometry/algorithms/transform.hpp>

namespace bg  = boost::geometry;

typedef bg::model::point<double, 2, bg::cs::cartesian> Point2D;
typedef bg::model::polygon<Point2D> Polygon;
//typedef bg::model::box<Point2D> box;

int main() {

    Polygon _poly;
    Polygon _poly2;

    Point2D A(4,3);
    Point2D B(4,5);
    Point2D C(6,5);
    Point2D D(6,3);
    Point2D CLOSE(4,3);

    _poly.outer().push_back(A);
    _poly.outer().push_back(B);
    _poly.outer().push_back(C);
    _poly.outer().push_back(D);

    std::cout << std::boolalpha << bg::is_valid(_poly) << "\n";
    bg::correct(_poly);
    std::cout << std::boolalpha << bg::is_valid(_poly) << "\n";
}

Выход:

false
true

В этом случае вы явно забыли добавить точку CLOSE

person sehe    schedule 28.06.2015
comment
Большое спасибо, да, я забыл точку ЗАКРЫТЬ, так как полигон не центрирован в начале координат. - person user3018940; 19.07.2015