Как использовать Projection_traits_xy_3? - PullRequest
0 голосов
/ 20 января 2020

Я могу видеть только черту проекции, использованную в примерах Делоне. И это выглядит достаточно просто.

Я пытаюсь использовать его в следующем коде, и я не могу понять это!

Возможно, я что-то делаю правильно, потому что Polygon_2 :: push_back сейчас ожидает Point_3.

Но остальное выплевывает страницы сообщений об ошибках.

Есть идеи?

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Boolean_set_operations_2.h>
#include <CGAL/Projection_traits_xy_3.h>

#include <iostream>
#include <list>

#include "print_utils.h"

typedef CGAL::Exact_predicates_inexact_constructions_kernel  Kernel;
typedef CGAL::Projection_traits_xy_3<Kernel>                 Gt;
typedef CGAL::Polygon_2<Gt>                                  Polygon_2;
typedef CGAL::Polygon_with_holes_2<Gt>                       Polygon_with_holes_2;
typedef Gt::Point_2                                          Point_3;

using namespace std;

int main(int argc, char* argv[])
{
  Point_3 rp(1.840203021427314, 11.442402094914751, 1.6289004237251579);
  Point_3 rq(-1.3754475586433301, 7.159592255512721, -0.8694054147780097);
  Point_3 rr(5.879661577210586, 9.559327916542575, 0.530440182558408);

  Point_3 aa(6.11, 18.550001, 5.775);
  Point_3 ab(-6.11, 18.55, 5.775);
  Point_3 ac(-6.11, 8.650001, 0);
  Point_3 ad(6.11, 8.650002, 0.000001);

  Polygon_2 pa;
  pa.push_back(rp);
  pa.push_back(rq);
  pa.push_back(rr);

  Polygon_2 pb;
  pb.push_back(aa);
  pb.push_back(ab);
  pb.push_back(ac);
  pb.push_back(ad);

  list<Polygon_with_holes_2> result;
  list<Polygon_with_holes_2>::const_iterator it;

  CGAL::do_intersect(pa, pb);
  // CGAL::intersection(pa, pb, std::back_inserter(result));
  return EXIT_SUCCESS;
}

1 Ответ

1 голос
/ 21 января 2020

Вы не сделали ничего плохого в своем коде, это функция do_intersect(), которая требует функторов, которых нет в projection_traits. Вам нужно построить "настоящий" полигон_2 из ваших проекций, а затем вызвать do_intersect для них.


typedef CGAL::Exact_predicates_inexact_constructions_kernel  Kernel;
typedef CGAL::Polygon_2<Kernel>                              Polygon_2;
typedef CGAL::Projection_traits_xy_3<Kernel>                 Gt;
typedef CGAL::Polygon_2<Gt>                                  Polygon_pr_2;
typedef CGAL::Polygon_with_holes_2<Gt>                       Polygon_with_holes_2;
typedef Gt::Point_2                                          Point_3;

using namespace std;

int main(int argc, char* argv[])
{
  Point_3 rp(1.840203021427314, 11.442402094914751, 1.6289004237251579);
  Point_3 rq(-1.3754475586433301, 7.159592255512721, -0.8694054147780097);
  Point_3 rr(5.879661577210586, 9.559327916542575, 0.530440182558408);

  Point_3 aa(6.11, 18.550001, 5.775);
  Point_3 ab(-6.11, 18.55, 5.775);
  Point_3 ac(-6.11, 8.650001, 0);
  Point_3 ad(6.11, 8.650002, 0.000001);

  Polygon_pr_2 pra;
  pra.push_back(rp);
  pra.push_back(rq);
  pra.push_back(rr);

  Polygon_pr_2 prb;
  prb.push_back(aa);
  prb.push_back(ab);
  prb.push_back(ac);
  prb.push_back(ad);

  Polygon_2 pa;
  for(const auto& p : pra)
  {
    pa.push_back(Kernel::Point_2(p.x(), p.y()));
  }

  Polygon_2 pb;
  for(const auto& p : prb)
  {
    pb.push_back(Kernel::Point_2(p.x(), p.y()));
  }
  list<Polygon_with_holes_2> result;
  list<Polygon_with_holes_2>::const_iterator it;

  CGAL::do_intersect(pa, pb);
  // CGAL::intersection(pa, pb, std::back_inserter(result));
  return EXIT_SUCCESS;
}
...