我必须序列化/反序列化一些确切的原理(最好以人类可读的格式),这些原理是使用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()的调用都将返回此类型的对象。

例如:

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


然后,您可以直接使用operator<<()序列化pp。但是请注意,您将从Epeck松开树结构。

关于c++ - CGAL中的精确数字序列化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58319234/

10-13 04:30