2016-08-17 2 views
0

Я новичок в CGAL.CGAL-4.8.1 Arrangements - Curz Bezier Save Arrangement to File Error

Я попытался изменить Примеры/Arrangement_on_surfaces_2 Bezier_curves.cpp, чтобы сохранить расположение в файл, как показано ниже:

//! \file examples/Arrangement_on_surface_2/Bezier_curves.cpp 
// Constructing an arrangement of Bezier curves. 

#include <fstream> 

#include <CGAL/basic.h> 

#ifndef CGAL_USE_CORE 
#include <iostream> 
int main() 
{ 
    std::cout << "Sorry, this example needs CORE ..." << std::endl; 
    return 0; 
} 
#else 

#include <CGAL/Cartesian.h> 
#include <CGAL/CORE_algebraic_number_traits.h> 
#include <CGAL/Arr_Bezier_curve_traits_2.h> 
#include <CGAL/Arrangement_2.h> 
#include <CGAL/IO/Arr_iostream.h> 

#include "arr_inexact_construction_segments.h" 
#include "arr_print.h" 

typedef CGAL::CORE_algebraic_number_traits    Nt_traits; 
typedef Nt_traits::Rational        NT; 
typedef Nt_traits::Rational        Rational; 
typedef Nt_traits::Algebraic       Algebraic; 
typedef CGAL::Cartesian<Rational>      Rat_kernel; 
typedef CGAL::Cartesian<Algebraic>      Alg_kernel; 
typedef Rat_kernel::Point_2        Rat_point_2; 
typedef CGAL::Arr_Bezier_curve_traits_2<Rat_kernel, Alg_kernel, Nt_traits> 
                 Traits_2; 
typedef Traits_2::Curve_2        Bezier_curve_2; 
typedef CGAL::Arrangement_2<Traits_2>     Arrangement_2; 
//typedef CGAL::Arrangement_2<Traits_2>     Arrangement; 

int main (int argc, char *argv[]) 
{ 
    // Get the name of the input file from the command line, or use the default 
    // Bezier.dat file if no command-line parameters are given. 
    const char *filename = (argc > 1) ? argv[1] : "Bezier.dat"; 
    const char *outfilename = (argc > 1) ? argv[1] : "BezierOut.dat"; 

    // Open the input file. 
    std::ifstream in_file (filename); 

    if (! in_file.is_open()) { 
    std::cerr << "Failed to open " << filename << std::endl; 
    return 1; 
    } 

    // Read the curves from the input file. 
    unsigned int    n_curves; 
    std::list<Bezier_curve_2> curves; 
    Bezier_curve_2    B; 
    unsigned int    k; 

    in_file >> n_curves; 
    for (k = 0; k < n_curves; k++) { 
    // Read the current curve (specified by its control points). 
    in_file >> B; 
    curves.push_back (B); 

    std::cout << "B = {" << B << "}" << std::endl; 
    } 
    in_file.close(); 

    // Construct the arrangement. 

    Arrangement_2     arr; 
    insert (arr, curves.begin(), curves.end()); 

    // Print the arrangement size. 
    std::ofstream out_file; 
    out_file.open(outfilename); 
    out_file << "The arrangement size:" << std::endl 
      << " V = " << arr.number_of_vertices() 
      << ", E = " << arr.number_of_edges() 
      << ", F = " << arr.number_of_faces() << std::endl; 

    out_file << arr; 
    out_file.close(); 

    return 0; 
} 

#endif 

Если я закомментируйте строку out_file < < обр; он отлично работает. В противном случае он генерирует ошибку C2678 в read_x_monotone_curve в Arr_text_formtter.h

Я использую Visual Studio 15 x86.

Благодарим за помощь.

ответ

0

Я решаю это, изменяя процедуру print_arrangement (arr) в arr_print.h, чтобы save_arrangement (arr) с std :: ofstream вместо std :: cout.

Похоже, что оператор < < не работает.

Если у кого-то есть лучшее решение, я открыт для него.

0

Точки пересечений в расположении кривых Безье не могут быть представлены точным образом. Поэтому такую ​​компоновку нельзя сохранить, используя экспорт по умолчанию (< <) и стандартный формат.

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