Пересечение CGAL возвращает ложный результат

Я немного смущен тем, как работает CGAL::do_intersect. Я думал, что функция возвращает true, если в обоих полигонах есть точка. Насколько я не ошибаюсь, in лежит внутри out и я должен увидеть true распечатанным или что я упускаю?

#include <CGAL/Point_2.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
typedef CGAL::Polygon_2<Kernel> Polygon_2;
int main(int argc, char **argv)
{
  Polygon_2 in, out;
  in.push_back(Point_2(1,1));
  in.push_back(Point_2(1,2));
  in.push_back(Point_2(2,2));
  in.push_back(Point_2(2,1));

  out.push_back(Point_2(0,0));
  out.push_back(Point_2(3,0));
  out.push_back(Point_2(3,3));
  out.push_back(Point_2(0,3));

  std::cout << "IN intersect with OUT is " << (CGAL::do_intersect(in, out) ? "true":"false") << std::endl;
  std::cout << "OUT intersect with IN is " << (CGAL::do_intersect(out, in) ? "true":"false") << std::endl;
  std::cout.flush();
}

person Philipp Jankov    schedule 08.09.2015    source источник


Ответы (1)


Вершины в многоугольнике должны быть против часовой стрелки. Следующий код производит желаемый результат:

IN intersect with OUT is true
OUT intersect with IN is true

#include <CGAL/Point_2.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Boolean_set_operations_2.h>

typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
typedef CGAL::Polygon_2<Kernel> Polygon_2;
int main(int argc, char **argv)
{
  Polygon_2 in, out;
  in.push_back(Point_2(1,1));
  in.push_back(Point_2(2,1));
  in.push_back(Point_2(2,2));
  in.push_back(Point_2(1,2));

  out.push_back(Point_2(0,0));
  out.push_back(Point_2(3,0));
  out.push_back(Point_2(3,3));
  out.push_back(Point_2(0,3));

  std::cout << "IN intersect with OUT is " << (CGAL::do_intersect(in, out) ? "true":"false") << std::endl;
  std::cout << "OUT intersect with IN is " << (CGAL::do_intersect(out, in) ? "true":"false") << std::endl;
  std::cout.flush();
}
person m.s.    schedule 08.09.2015
comment
Большое спасибо. Я не смог найти ничего документирующего это. - person Philipp Jankov; 09.09.2015