如何使用Arr_conic_traits_2的曲线_2来近似代数段?

时间:2017-08-25 13:45:42

标签: computational-geometry cgal

我正在计算两个线段(类型RatKernel::Segment_2)的平面平分线,它可以由抛物线弧,光线和线段组成。

使用Arr_conic_traits_2<RatKernel, AlgKernel, NtTraits>类我可以轻松创建抛物线弧的部分,这不是问题。正如reference中所规定的,弧的支撑曲线必须是以下形式:rx^2 + sy^2 + txy + ux + vy + w = 0,其中所有六个系数都需要是有理数。但是,弧的端点可以是Point_2和代数坐标。

问题出现在光线(无论如何必须被限制到非常长的段,因为圆锥曲线类只支持有界曲线)和段,因为为了将它们连接到抛物线弧,它们 还需要有代数端点。这意味着支撑曲线(一条线)也会有代数系数,但这不受支持。

我真的需要平分线的所有部分彼此连接,因为用合理的段近似段部分(从而使平分线部分断开)似乎在其他计算中引起错误。

一个想法是使用几乎平坦的曲线近似这些段平分线部分;问题是我只有两个端点,我可以在中间创建第三个点并稍微移动它(因此它可以很容易地具有理性坐标),这样通过三个点的曲线就不会是平坦的。 /> 有三个点(两个强有力的代数)我需要创建一个满足它们并且具有合理系数的曲线。这可能吗?有更好的解决方案吗?

PS:使用其他排列类如Arr_algebraic_segment_traits_2将允许我使用无界光线,但如果我理解正确,所有曲线的端点都需要将x坐标作为整数,这甚至更大问题

1 个答案:

答案 0 :(得分:0)

毕竟尝试使用Arr_algebraic_segment_traits_2。 由该特征处理的曲线是零个多项式集的图。限制是系数必须是整数,这意味着也可以处理具有有理系数的多项式。点的坐标是实数。

要构建实数并将其用作坐标,请执行以下操作:

#include <CGAL/Algebraic_kernel_d_1.h>

typedef CGAL::Algebraic_kernel_d_1<Integer>             AK;
typedef AK::Polynomial_1                                Polynomial_1;

AK ak;
AK::Construct_algebraic_real_1 construct_algreal_1 =
  ak.construct_algebraic_real_1_object();
Polynomial_1 px = CGAL::shift(AK::Polynomial_1(1),1);
Algebraic_real_1 c = construct_algreal_1(px*px-2,1);
Point_2 p = construct_point(c, c);