c++ CGAL::Extended_cartesian< CGAL::Gmpq>和CGAL::Simple_cartesian之间的转换< CGAL::Gmpq>

xzv2uavs  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(157)

将内核中的对象Simple_cartesian转换为Extended_cartesian很简单。

CGAL::Simple_cartesian<CGAL::Gmpq>::Point_3 p_s(1, 2, 3);
CGAL::Extended_cartesian<CGAL::Gmpq>::Point_3 p_e(p_s.x(), p_s.y(), p_s.z());

我的问题是怎么倒着做,好像不能像上面那样做,假设我知道Extended_cartesian核数类型表示的数是有限有理数,我检查FT类型后,看起来类型是CGAL::Nef_polynomial<CGAL::Gmpq>。我如何正确地将它转换回标准类型,在这种情况下是CGAL::Gmpq?我想找到一个无损的转换。换句话说,将其转换为double,然后转换为CGAL::Gmpq是次优的。

luaexgnf

luaexgnf1#

扩展内核仅用于Nef多边形和多面体来表示非有限对象(像射线)。在这种情况下,所有的坐标都变成 * 扩展 *,并且这种扩展是使用CGAL::Nef_polynomial类型实现的。看起来这种类型的对象是由系数数组表示的。如果你使用规则点(在CGAL * 标准 * 点中调用),那么它们的坐标将由这些数组的第一个元素表示-因此,解决方案:

#include <iostream>

#include <CGAL/Simple_cartesian.h>
#include <CGAL/Extended_cartesian.h>
#include <CGAL/Gmpq.h>

using KernelE = CGAL::Extended_cartesian<CGAL::Gmpq>;
using PointE = KernelE::Point_3;

using KernelS = CGAL::Simple_cartesian<CGAL::Gmpq>;
using PointS = KernelS::Point_3;

int main()
{
  PointE const pe{1, 2, 3};
  std::cout << pe << std::endl;
  PointS const ps(pe.x()[0], pe.y()[0], pe.z()[0]);
  std::cout << ps << std::endl;
}

上面的方法可能不是CGAL开发人员计划的。实际上,我查看了Extended_cartesian.h头文件,发现了一个函数standard_point,它返回了你想要的(但仅针对2D中的点):

Standard_point_2 standard_point(const Point_2& p) const
/*{\Xop returns the standard point represented by |p|.
\precond |\Mvar.is_standard(p)|.}*/
{ CGAL_assertion( type(p)==STANDARD );
  return Standard_point_2(p.x()[0],p.y()[0]);
}

因此,上面的解决方案与此功能类似。

相关问题