Computational geometry 检查给定点是否位于圆(CGAL)的(无)边界边/边界上

Computational geometry 检查给定点是否位于圆(CGAL)的(无)边界边/边界上,computational-geometry,cgal,Computational Geometry,Cgal,我正在使用Kernel::Circle\u 2和CGAL::Arr\u Circle\u segment\u traits\u 2 给定一个点(这组特征的嵌套类型point_2),我想检查它是在有界边、无界边还是在给定圆的边界上 类Circle_2有一个名为bounded_side的函数,但它只支持Kernel::Point_2的点。当我使用CGAL::to_double()将点转换为此类时,我会失去准确性 是否有其他方法执行此检查? 如果有帮助,我将信息存储在2D_排列中。您可以使用以下代码。

我正在使用Kernel::Circle\u 2和CGAL::Arr\u Circle\u segment\u traits\u 2

给定一个点(这组特征的嵌套类型point_2),我想检查它是在有界边、无界边还是在给定圆的边界上

类Circle_2有一个名为bounded_side的函数,但它只支持Kernel::Point_2的点。当我使用CGAL::to_double()将点转换为此类时,我会失去准确性

是否有其他方法执行此检查?
如果有帮助,我将信息存储在2D_排列中。

您可以使用以下代码。请注意,二维点的坐标类型为

#包括
#包括
typedef CGAL::精确谓词\精确构造\内核K;
typedef CGAL::Arr_圆_段_特征_2特征;
typedef Traits::Point_2::CoordNT Sqrt_扩展;
CGAL::有界_边
incircle(常数类型名称K::圆圈2和圆圈,
const typename Traits::Point_2&p)
{
常数K::点2&中心=圆。中心();
K::FT sq_rad=圆的平方半径();
开关(CGAL::compare(CGAL::square(p.x()-center.x())-sq_rad,
-CGAL::square(p.y()-center.y())
{
案例CGAL::更大:
返回CGAL::在\u无界\u侧;
案例CGAL::较小:
返回CGAL::在\u-BOUNDED\u侧;
案例CGAL::相等:
打破
}
返回_边界上的CGAL::;
}
int main()
{
K::圆_2圆(K::点_2(0,0),2);
特征:点2向外(Sqrt_扩展(1,2,3),Sqrt_扩展(4,5,6));
CGAL_断言(incrcle(circle,out)=CGAL::在无界侧);
特征::点2 in(Sqrt_扩展(1),Sqrt_扩展(0));
CGAL_断言(incercle(circle,in)=CGAL::在有界侧);
特征:点2 bnd(Sqrt_扩展(0,1,2),Sqrt_扩展(0));
CGAL_断言(incrcle(circle,bnd)=CGAL::ON_边界);
返回0;
}
    #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
    #include <CGAL/Arr_circle_segment_traits_2.h>

    typedef CGAL::Exact_predicates_exact_constructions_kernel K;
    typedef CGAL::Arr_circle_segment_traits_2<K> Traits;
    typedef Traits::Point_2::CoordNT Sqrt_extension;

    CGAL::Bounded_side
    incircle(const typename K::Circle_2& circle,
             const typename Traits::Point_2& p)
    {
      const K::Point_2& center = circle.center();
      K::FT sq_rad = circle.squared_radius();

      switch(CGAL::compare(  CGAL::square(p.x()-center.x())-sq_rad,
                            -CGAL::square(p.y()-center.y()) ) )
      {
        case CGAL::LARGER:
          return CGAL::ON_UNBOUNDED_SIDE;
        case CGAL::SMALLER:
          return CGAL::ON_BOUNDED_SIDE;
        case CGAL::EQUAL:
          break;
      }
      return CGAL::ON_BOUNDARY;
    }

    int main()
    {

      K::Circle_2 circle(K::Point_2(0,0), 2);

      Traits::Point_2 out(Sqrt_extension(1,2,3) , Sqrt_extension(4,5,6));
      CGAL_assertion( incircle(circle, out) == CGAL::ON_UNBOUNDED_SIDE );

      Traits::Point_2 in(Sqrt_extension(1) , Sqrt_extension(0));
      CGAL_assertion( incircle(circle, in) == CGAL::ON_BOUNDED_SIDE );

      Traits::Point_2 bnd(Sqrt_extension(0,1,2) , Sqrt_extension(0));
      CGAL_assertion( incircle(circle, bnd) == CGAL::ON_BOUNDARY );

      return 0;
    }