如何使用 Arr_conic_traits_2 的 Curve_2 来近似代数段?
How can I approximate an algebraic segment using a Curve_2 of Arr_conic_traits_2?
我正在计算两条线段(RatKernel::Segment_2
类型)的平面平分线,这两条线段可以由抛物线弧、射线和线段组成。
使用 Arr_conic_traits_2<RatKernel, AlgKernel, NtTraits>
class 我可以轻松创建抛物线弧的部分,这不是问题。正如 reference 中指定的那样,弧的支撑曲线需要采用以下形式: rx^2 + sy^2 + txy + ux + vy + w = 0
其中所有六个系数都需要是有理数。但是,圆弧的端点可以是Point_2
代数坐标。
问题出现在射线(由于圆锥特征 class 只支持有界曲线,射线必须被限制在很长的线段上)和线段,因为为了将它们连接到抛物线, 他们
还需要有代数端点。这意味着支持曲线(一条线)也会有代数系数,但这不受支持。
我确实需要将平分线的所有部分相互连接,因为用有理线段近似线段部分(从而使平分线部分断开连接)似乎会导致其他计算出错。
一个想法是使用几乎平坦的曲线来近似这些线段平分线部分;问题是我只有两个端点,我可以在中间创建第三个点并稍微移动它(因此它可以很容易地得到有理坐标)这样通过这三个点的曲线就不会是平的。
有三个点(两个有力的代数点)我需要创建一条曲线来满足它们并且具有有理系数。这可能吗?有没有更好的解决方案?
P.S.: 使用另一种排列 class 例如 Arr_algebraic_segment_traits_2
将允许我使用无限射线,但如果我理解正确的话,所有曲线的端点都需要有x坐标是一个整数,这个问题就更大了
毕竟尝试使用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);
我正在计算两条线段(RatKernel::Segment_2
类型)的平面平分线,这两条线段可以由抛物线弧、射线和线段组成。
使用 Arr_conic_traits_2<RatKernel, AlgKernel, NtTraits>
class 我可以轻松创建抛物线弧的部分,这不是问题。正如 reference 中指定的那样,弧的支撑曲线需要采用以下形式: rx^2 + sy^2 + txy + ux + vy + w = 0
其中所有六个系数都需要是有理数。但是,圆弧的端点可以是Point_2
代数坐标。
问题出现在射线(由于圆锥特征 class 只支持有界曲线,射线必须被限制在很长的线段上)和线段,因为为了将它们连接到抛物线, 他们 还需要有代数端点。这意味着支持曲线(一条线)也会有代数系数,但这不受支持。
我确实需要将平分线的所有部分相互连接,因为用有理线段近似线段部分(从而使平分线部分断开连接)似乎会导致其他计算出错。
一个想法是使用几乎平坦的曲线来近似这些线段平分线部分;问题是我只有两个端点,我可以在中间创建第三个点并稍微移动它(因此它可以很容易地得到有理坐标)这样通过这三个点的曲线就不会是平的。
有三个点(两个有力的代数点)我需要创建一条曲线来满足它们并且具有有理系数。这可能吗?有没有更好的解决方案?
P.S.: 使用另一种排列 class 例如 Arr_algebraic_segment_traits_2
将允许我使用无限射线,但如果我理解正确的话,所有曲线的端点都需要有x坐标是一个整数,这个问题就更大了
毕竟尝试使用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);