CGAL пример не может прочитать входные файлы? - PullRequest
0 голосов
/ 27 марта 2020

это мой первый вопрос stackoverflow, поэтому я надеюсь, что следующий текст отвечает требованиям вопроса. Если нет, пожалуйста, скажите мне, что нужно изменить, чтобы я мог адаптировать вопрос.

Я новичок в CGAL и C ++ в целом. Я хотел бы использовать CGAL 5.0.2 на Macbook Pro в начале 2015 года с macOS Catalina версии 10.15.4.

Итак, для начала я выполнил инструкции , приведенные в документации CGAL используя менеджер пакетов Homebrew . Поскольку CGAL является библиотекой только для заголовков, я настроил ее, используя CMake , как рекомендовано документацией.

Все работало нормально, поэтому я продолжал пробовать рекомендуемые примеры, приведенные в файле CGAL-5.0.2.tar.xz, который предоставляется здесь . Мне особенно интересен пример Voronoi_Diagram_2. Используя терминал, я выполнил команду -DCGAL_DIR=$HOME/CGAL-5.0.2 -DCMAKE_BUILD_TYPE=Release . в папке примеров под названием Voronoi_Diagram_2. Затем я выполнил команду make. Все прошло хорошо, сообщений об ошибках не было. Но выполнение результирующего файла exe c не дало никаких результатов.

После некоторых исследований мне удалось изменить код таким образом, чтобы он печатал значения некоторых переменных. Кажется, проблема в том, что входной файл, который содержит отрезки, для которых должна быть рассчитана диаграмма вороного, читается неправильно. В то время как l oop, который я выделил в коде ниже, вставляя знаки ////, кажется, не вводится. Поэтому я предполагаю, что переменная ifs пуста, хотя входного файла "data1.svd.cin", который можно найти в папке "data" примера, не было.

У кого-нибудь есть идеи по причинам такого поведения? Любая помощь приветствуется.

Это файл vd_2_point_location_sdg_linf. cpp, включенный в пример, который я изменил:

// standard includes
#include <iostream>

#include <fstream>

#include <cassert>

// includes for defining the Voronoi diagram adaptor

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Segment_Delaunay_graph_Linf_filtered_traits_2.h>

#include <CGAL/Segment_Delaunay_graph_Linf_2.h>
#include <CGAL/Voronoi_diagram_2.h>
#include <CGAL/Segment_Delaunay_graph_adaptation_traits_2.h>
#include <CGAL/Segment_Delaunay_graph_adaptation_policies_2.h>
// typedefs for defining the adaptor

typedef CGAL::Exact_predicates_inexact_constructions_kernel                  K;
typedef CGAL::Segment_Delaunay_graph_Linf_filtered_traits_2<K>               Gt;
typedef CGAL::Segment_Delaunay_graph_Linf_2<Gt>                              DT;
typedef CGAL::Segment_Delaunay_graph_adaptation_traits_2<DT>                 AT;
typedef CGAL::Segment_Delaunay_graph_degeneracy_removal_policy_2<DT>         AP;
typedef CGAL::Voronoi_diagram_2<DT,AT,AP>                                    VD;

// typedef for the result type of the point location
typedef AT::Site_2                    Site_2;
typedef AT::Point_2                   Point_2;
typedef VD::Locate_result             Locate_result;
typedef VD::Vertex_handle             Vertex_handle;
typedef VD::Face_handle               Face_handle;
typedef VD::Halfedge_handle           Halfedge_handle;
typedef VD::Ccb_halfedge_circulator   Ccb_halfedge_circulator;

void print_endpoint(Halfedge_handle e, bool is_src) {
  std::cout << "\t";
  if ( is_src ) {
    if ( e->has_source() )  std::cout << e->source()->point() << std::endl;
    else  std::cout << "point at infinity" << std::endl;
  } else {
    if ( e->has_target() )  std::cout << e->target()->point() << std::endl;
    else  std::cout << "point at infinity" << std::endl;
  }
}

int main()
{
  std::ifstream ifs("data/data1.svd.cin");
  assert( ifs );
  VD vd;
  Site_2 t;


// /////////// Inserted Comment ////////////////////////////////
std::cout << "In the following the insertion from ifs should take place" << std::flush;

// ///////////////// while loop which doesn't seem to be active //////////////////
  while ( ifs >> t ) { 
// Existing Code to insert the points in the voronoi structure
    vd.insert(t); 

// Inserted Code to check if while loop is entered
    std::cout << "Entered while loop" << std::flush;

}
// ///////////////////////////////////////////////////////////////////////////////



ifs.close();
  assert( vd.is_valid() );
  std::ifstream ifq("data/queries1.svd.cin");
  assert( ifq );
  Point_2 p;
  while ( ifq >> p ) {
    std::cout << "Query point (" << p.x() << "," << p.y()
              << ") lies on a Voronoi " << std::flush;
    Locate_result lr = vd.locate(p);
    if ( Vertex_handle* v = boost::get<Vertex_handle>(&lr) ) {
      std::cout << "vertex." << std::endl;
      std::cout << "The Voronoi vertex is:" << std::endl;
      std::cout << "\t" << (*v)->point() << std::endl;
    } else if ( Halfedge_handle* e = boost::get<Halfedge_handle>(&lr) ) {
      std::cout << "edge." << std::endl;
      std::cout << "The source and target vertices "
                << "of the Voronoi edge are:" << std::endl;
      print_endpoint(*e, true);
      print_endpoint(*e, false);
    } else if ( Face_handle* f = boost::get<Face_handle>(&lr) ) {
      std::cout << "face." << std::endl;
      std::cout << "The vertices of the Voronoi face are"
                << " (in counterclockwise order):" << std::endl;
      Ccb_halfedge_circulator ec_start = (*f)->ccb();
      Ccb_halfedge_circulator ec = ec_start;
      do {
        print_endpoint(ec, false);
      } while ( ++ec != ec_start );
    }
    std::cout << std::endl;
  }
  ifq.close();
  return 0;
}
...