2017-01-03 7 views
2

私はKernel :: Circle_2をCGAL :: Arr_circle_segment_traits_2で使用しています。与えられた点が円の制限された側/境界(CGAL)にあるかどうかを調べる

ポイント(この特性セットのネストされたタイプPoint_2)がある場合、それは有界側、無限側、または指定された円の境界上にあるかどうかチェックしたいと思います。

Circle_2クラスのbounded_sideという関数がありますが、Kernel :: Point_2の点だけをサポートしています。ポイントをこのクラスに変換するためにCGAL :: to_double()を使用すると、精度が失われます。

このチェックを行う別の方法はありますか? 情報が2D_Arrangementに保存されています。

答えて

1

次のコードを使用できます。 2D点の座標はSqrt_extensionであることに注意してください。

#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; 
    } 
+0

ありがとう、@シロリ! – Mega

関連する問題