我正在计算两个线段(类型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坐标作为整数,这甚至更大问题
答案 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);