Сериализация точных чисел в CGAL - PullRequest
0 голосов
/ 10 октября 2019

Мне нужно сериализовать / десериализовать некоторые точные рациональные значения (предпочтительно в удобочитаемом формате), вычисленные с помощью CGAL Exact_predicates_exact_constructions_kernel (Epeck с ленивой оценкой).

Моя идея заключалась в использовании Cartesian_converter для преобразования чисел Эпека в точные числа типа Фактор и числитель и знаменатель экспорта по отдельности:

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Cartesian_converter.h>
#include <CGAL/Quotient.h>
#include <CGAL/MP_Float.h>
#include <CGAL/Simple_cartesian.h>

using QKernel = CGAL::Simple_cartesian<CGAL::Quotient<CGAL::MP_Float>>; 
using Epeck = CGAL::Exact_predicates_exact_constructions_kernel;

// ...

CGAL::Point_2<Epeck> p(x, y);
CGAL::Cartesian_converter<Epeck, QKernel> to_qkernel;
CGAL::Point_2<QKernel> q = to_qkernel(p);

std::cout << q.x().numerator() << "/" << q.x().denominator() << " " 
          << q.y().numerator() << "/" << q.y().denominator() << std::endl;

Не компилируется, так как нет соответствующего конструктора. Кажется, что Cartesian_converter пытается поместить число Epeck в качестве числителя, который не может работать, так как число Epeck является FieldType, тогда как числитель должен быть RingType.

/usr/local/include/CGAL/Quotient.h:97:35: error: no matching constructor for initialization of 'CGAL::Quotient<CGAL::MP_Float>::NT' (aka 'CGAL::MP_Float')
  explicit Quotient(const T& n) : num(n), den(1) {}
                                  ^   ~

Более того, это, кажется, несамый умный способ сериализации (если он будет работать), поскольку ни числитель, ни знаменатель не должны быть целыми.

Вопрос: Есть ли способ сериализации числа типа Epeck::FT в строку n + "/" + d, где n и d являются целыми числами?

1 Ответ

1 голос
/ 10 октября 2019

Epeck::Exact_kernel - это точное нефильтрованное ядро, используемое внутри. Это означает, что вызовы любого объекта ядра CGAL::exact() вернут объект этого типа.

Например:

Epeck::Point_3 p;
Epeck::Exact_kernel pp = CGAL::exact(p);

Затем вы можете сериализовать pp напрямую, используя operator<<(). Обратите внимание, что вы потеряете древовидную структуру из Epeck.

...