CGAL 中精确数字的序列化
Serialization of exact numbers in CGAL
我必须 serialize/deserialize 一些精确的有理数(最好是人类可读的格式),用 CGALs Exact_predicates_exact_constructions_kernel(Epeck 惰性评估)计算。
我的想法是使用 Cartesian_converter
将 Epeck 数转换为 Quotient 类型的精确数并分别导出分子和分母:
#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是整数?
Epeck::Exact_kernel
是内部使用的确切的非过滤内核。这意味着对任何内核对象 CGAL::exact()
的调用将 return 来自该类型的对象。
例如:
Epeck::Point_3 p;
Epeck::Exact_kernel pp = CGAL::exact(p);
然后就可以直接使用operator<<()
序列化pp了。但是请注意,您将从 Epeck 松散树结构。
我必须 serialize/deserialize 一些精确的有理数(最好是人类可读的格式),用 CGALs Exact_predicates_exact_constructions_kernel(Epeck 惰性评估)计算。
我的想法是使用 Cartesian_converter
将 Epeck 数转换为 Quotient 类型的精确数并分别导出分子和分母:
#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是整数?
Epeck::Exact_kernel
是内部使用的确切的非过滤内核。这意味着对任何内核对象 CGAL::exact()
的调用将 return 来自该类型的对象。
例如:
Epeck::Point_3 p;
Epeck::Exact_kernel pp = CGAL::exact(p);
然后就可以直接使用operator<<()
序列化pp了。但是请注意,您将从 Epeck 松散树结构。