⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 circleh2.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1999  Utrecht University (The Netherlands),// ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany),// INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg// (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria),// and Tel-Aviv University (Israel).  All rights reserved.//// This file is part of CGAL (www.cgal.org); you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License as// published by the Free Software Foundation; version 2.1 of the License.// See the file LICENSE.LGPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Homogeneous_kernel/include/CGAL/Homogeneous/CircleH2.h $// $Id: CircleH2.h 35643 2006-12-27 23:28:15Z spion $////// Author(s)     : Sven Schoenherr//                 Stefan Schirra#ifndef CGAL_CIRCLEH2_H#define CGAL_CIRCLEH2_H#include <CGAL/utility.h>#include <CGAL/Interval_nt.h>CGAL_BEGIN_NAMESPACEtemplate <class R_>class CircleH2{    typedef typename R_::FT                   FT;    typedef typename R_::RT                   RT;    typedef typename R_::Point_2              Point_2;    typedef Triple<Point_2, FT, Orientation>         Rep;    typedef typename R_::template Handle<Rep>::type  Base;    Base base;public:    typedef R_                                    R;    CircleH2() {}    CircleH2(const Point_2& p, const Point_2& q, const Point_2& r)    {      Orientation o = CGAL::orientation( p, q, r);      CGAL_kernel_precondition( o != COLLINEAR);      Point_2    cp   = circumcenter( p, q, r);      FT         sq_r = squared_distance( p, cp);      base = Rep(cp, sq_r, o);    }    CircleH2(const Point_2& p, const Point_2& q, const Orientation& o)    {      CGAL_kernel_precondition( o != COLLINEAR);      if ( p != q)      {         Point_2    cp   = midpoint( p, q);         FT         sq_r = squared_distance( cp, p);         base = Rep(cp, sq_r, o);      }      else         base = Rep(p, FT( 0), o);    }    CircleH2(const Point_2& cp, const FT& squared_radius,             const Orientation& o)    {      CGAL_precondition( ( ! CGAL_NTS is_negative( squared_radius)) &&                         ( o != COLLINEAR ) );      base = Rep(cp, squared_radius, o);    }    const Point_2 &    center() const;    Orientation    orientation() const;    const FT &    squared_radius() const;    CircleH2<R>    opposite() const;    Oriented_side    oriented_side(const Point_2& ) const;    Bounded_side    bounded_side(const Point_2& ) const;    bool  operator==( const CircleH2<R>& ) const;    bool  operator!=( const CircleH2<R>& ) const;    bool  has_on_positive_side(const Point_2& ) const;    bool  has_on_negative_side(const Point_2& ) const;    bool  has_on_boundary( const Point_2& ) const;    bool  has_on_bounded_side( const Point_2& ) const;    bool  has_on_unbounded_side(const Point_2&) const;    bool  is_degenerate() const;    // bool  oriented_equal( const CircleH2<R>& ) const;    // bool  unoriented_equal( const CircleH2<R>& ) const;};template <class R>inlineconst typename CircleH2<R>::Point_2 &CircleH2<R>::center() const{ return get(base).first; }template <class R>inlineconst typename CircleH2<R>::FT &CircleH2<R>::squared_radius() const{ return get(base).second; }template <class R>CGAL_KERNEL_INLINECircleH2<R>CircleH2<R>::opposite() const{  return CircleH2<R>( center(),                          squared_radius(),                          CGAL::opposite( orientation() ) );}template <class R>inlineOrientationCircleH2<R>::orientation() const{ return get(base).third; }template <class R>CGAL_KERNEL_INLINEOriented_sideCircleH2<R>::oriented_side( const typename CircleH2<R>::Point_2& p) const{  FT sq_dist = squared_distance( p, center() );  FT sq_rad  = squared_radius();  Comparison_result vgl = CGAL_NTS compare( sq_dist, sq_rad );  Oriented_side rel_pos = (vgl == LARGER ) ?                                   ON_NEGATIVE_SIDE :                                   ( (vgl == SMALLER ) ?                                          ON_POSITIVE_SIDE :                                          ON_ORIENTED_BOUNDARY);  if (orientation() == POSITIVE)  { return rel_pos; }  else       // NEGATIVE  { return CGAL::opposite( rel_pos ); }}template <class R>CGAL_KERNEL_INLINEboolCircleH2<R>::has_on_positive_side(const typename CircleH2<R>::Point_2& p) const{  if ( orientation() == POSITIVE )  { return (has_on_bounded_side(p) ); }  else  { return (has_on_unbounded_side(p) ); }}template <class R>CGAL_KERNEL_INLINEboolCircleH2<R>::has_on_boundary(const typename CircleH2<R>::Point_2& p) const{  FT sq_dist = squared_distance( p, center() );  FT sq_rad  = squared_radius();  return ( sq_dist == sq_rad );}template <class R>CGAL_KERNEL_INLINEboolCircleH2<R>::has_on_negative_side( const typename CircleH2<R>::Point_2&p) const{  if ( orientation() == NEGATIVE )  {      return (has_on_bounded_side(p) );  }  else  {      return (has_on_unbounded_side(p) );  }}template <class R>CGAL_KERNEL_INLINEBounded_sideCircleH2<R>::bounded_side(const typename CircleH2<R>::Point_2& p) const{  FT sq_dist = squared_distance( p, center() );  FT sq_rad  = squared_radius();  Comparison_result vgl = CGAL_NTS compare( sq_dist, sq_rad );  return  (vgl == LARGER ) ? ON_UNBOUNDED_SIDE :                                   ( (vgl == SMALLER ) ?                                          ON_BOUNDED_SIDE :                                          ON_BOUNDARY);}template <class R>CGAL_KERNEL_INLINEboolCircleH2<R>::has_on_bounded_side(const typename CircleH2<R>::Point_2& p) const{  FT sq_dist = squared_distance( p, center() );  FT sq_rad  = squared_radius();  return ( sq_dist < sq_rad );}template <class R>CGAL_KERNEL_INLINEboolCircleH2<R>::has_on_unbounded_side(const typename CircleH2<R>::Point_2&p) const{  FT sq_dist = squared_distance( p, center() );  FT sq_rad  = squared_radius();  return ( sq_rad < sq_dist );}template <class R>inlineboolCircleH2<R>::is_degenerate() const{ return ( squared_radius() == FT(0) ); }template <class R>CGAL_KERNEL_INLINEboolCircleH2<R>::operator==(const CircleH2<R>& c) const{  return  ( center() == c.center() )        &&( squared_radius() == c.squared_radius() )        &&( orientation() == c.orientation() );}template <class R>inlineboolCircleH2<R>::operator!=(const CircleH2<R>& c) const{ return !(*this == c); }CGAL_END_NAMESPACE#endif // CGAL_CIRCLEH2_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -