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

📄 aff_transformation_rep_2.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 2000  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/Cartesian_kernel/include/CGAL/Cartesian/Aff_transformation_rep_2.h $// $Id: Aff_transformation_rep_2.h 32863 2006-08-01 08:18:19Z spion $// //// Author(s)     : Andreas Fabri, Lutz Kettner#ifndef CGAL_CARTESIAN_AFF_TRANSFORMATION_REP_2_H#define CGAL_CARTESIAN_AFF_TRANSFORMATION_REP_2_H#include <CGAL/determinant.h>CGAL_BEGIN_NAMESPACEtemplate < class R >class Aff_transformation_rep_baseC2  : public Ref_counted_virtual{public:  typedef typename R::FT                   FT;  typedef typename R::Point_2              Point_2;  typedef typename R::Vector_2             Vector_2;  typedef typename R::Direction_2          Direction_2;  typedef typename R::Aff_transformation_2 Aff_transformation_2;  virtual ~Aff_transformation_rep_baseC2() {}  virtual Point_2     transform(const Point_2 &p) const  = 0;  virtual Vector_2    transform(const Vector_2 &v) const = 0;  virtual Direction_2 transform(const Direction_2 &d) const=0;  virtual Aff_transformation_2 operator*(                       const Aff_transformation_rep_baseC2 &t) const = 0;  virtual Aff_transformation_2 compose(                       const Aff_transformation_repC2<R> &t) const  = 0;  virtual Aff_transformation_2 compose(                       const Translation_repC2<R> &t) const  = 0;  virtual Aff_transformation_2 compose(                       const Rotation_repC2<R> &t) const  = 0;  virtual Aff_transformation_2 compose(                       const Scaling_repC2<R> &t) const  = 0;  virtual Aff_transformation_2 inverse() const  = 0;  virtual bool                 is_even() const  = 0;  virtual FT                   cartesian(int i, int j) const = 0;  virtual std::ostream         &print(std::ostream &os) const = 0;};template < class R >class Aff_transformation_repC2  : public Aff_transformation_rep_baseC2<R>{public:  typedef typename R::FT                              FT;  typedef Aff_transformation_repC2<R>                 Self;  typedef Aff_transformation_rep_baseC2<R>            Aff_t_base;  typedef typename Aff_t_base::Point_2                Point_2;  typedef typename Aff_t_base::Vector_2               Vector_2;  typedef typename Aff_t_base::Direction_2            Direction_2;  typedef typename Aff_t_base::Aff_transformation_2   Aff_transformation_2;friend class Translation_repC2<R>;friend class Rotation_repC2<R>;friend class Scaling_repC2<R>;  Aff_transformation_repC2()  {}  Aff_transformation_repC2( const FT& m11, const FT& m12,                            const FT& m21, const FT& m22)    : t11(m11), t12(m12), t13(0),      t21(m21), t22(m22), t23(0)  {}  Aff_transformation_repC2( const FT& m11, const FT& m12, const FT& m13,                            const FT& m21, const FT& m22, const FT& m23)    : t11(m11), t12(m12), t13(m13),      t21(m21), t22(m22), t23(m23)  {}  Point_2 transform(const Point_2& p) const  {    typename R::Construct_point_2 construct_point_2;    return construct_point_2(t11 * p.x() + t12 * p.y() + t13,			     t21 * p.x() + t22 * p.y() + t23);  }  // note that a vector is not translated  Vector_2 transform(const Vector_2& v) const  {    return Vector_2(t11 * v.x() + t12 * v.y(),                    t21 * v.x() + t22 * v.y());  }  // note that a direction is not translated  Direction_2 transform(const Direction_2& dir) const  {    return Direction_2(t11 * dir.dx() + t12 * dir.dy(),                       t21 * dir.dx() + t22 * dir.dy());  }  // Note that Aff_transformation is not defined yet,  // so the following 6 functions have to be implemented later...  Aff_transformation_2 inverse() const;  Aff_transformation_2 operator*(const Aff_t_base &t) const;  Aff_transformation_2 compose(const Self &t) const;  Aff_transformation_2 compose(const Translation_repC2<R> &t) const;  Aff_transformation_2 compose(const Rotation_repC2<R> &t) const;  Aff_transformation_2 compose(const Scaling_repC2<R> &t) const;  bool is_even() const  {    return sign_of_determinant2x2(t11, t12, t21, t22) == POSITIVE;  }  FT cartesian(int i, int j) const  {    switch (i)    {    case 0: switch (j)            {              case 0: return t11;              case 1: return t12;              case 2: return t13;            }    case 1: switch (j)            {              case 0: return t21;              case 1: return t22;              case 2: return t23;            }    case 2: switch (j)            {              case 0: return FT(0);              case 1: return FT(0);              case 2: return FT(1);            }    }    return FT(0);  }  std::ostream &print(std::ostream &os) const  {    os <<"Aff_transformationC2(" <<t11<<" "<<t12<<" "<<t13<<std::endl;    os <<"                     " <<t21<<" "<<t22<<" "<<t23<<")";    return os;  }private:    FT   t11, t12, t13;    FT   t21, t22, t23;};template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC2<R>::Aff_transformation_2Aff_transformation_repC2<R>::inverse() const{  FT det = FT(1) / (t11 * t22 - t12 * t21);  return Aff_transformation_2(    det * t22,    det * (-t12), det * (t12*t23-t13*t22),    det * (-t21), det * t11 ,   det * (t13*t21-t11*t23));}template < class R >CGAL_KERNEL_INLINEtypename Aff_transformation_repC2<R>::Aff_transformation_2Aff_transformation_repC2<R>::operator*(const Aff_transformation_rep_baseC2<R> &t) const{  return t.compose(*this);} template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC2<R>::Aff_transformation_2Aff_transformation_repC2<R>::compose(const Aff_transformation_repC2<R> &t) const{  return Aff_transformation_2(t.t11*t11 + t.t12*t21,                              t.t11*t12 + t.t12*t22,                              t.t11*t13 + t.t12*t23 + t.t13,                              t.t21*t11 + t.t22*t21,                              t.t21*t12 + t.t22*t22,                              t.t21*t13 + t.t22*t23 + t.t23 );}template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC2<R>::Aff_transformation_2Aff_transformation_repC2<R>::compose(const Translation_repC2<R> &t) const{  return Aff_transformation_2(t11,                              t12,                              t13 + t.translationvector_.x(),                              t21,                              t22,                              t23 + t.translationvector_.y());}template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC2<R>::Aff_transformation_2Aff_transformation_repC2<R>::compose(const Rotation_repC2<R> &t) const{  return Aff_transformation_2(t.cosinus_*t11 - t.sinus_*t21,                              t.cosinus_*t12 - t.sinus_*t22,                              t.cosinus_*t13 - t.sinus_*t23,                              t.sinus_*t11 + t.cosinus_*t21,                              t.sinus_*t12 + t.cosinus_*t22,                              t.sinus_*t13 + t.cosinus_*t23);}template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC2<R>::Aff_transformation_2Aff_transformation_repC2<R>::compose(const Scaling_repC2<R> &t) const{   return Aff_transformation_2(t.scalefactor_ * t11,                               t.scalefactor_ * t12,                               t.scalefactor_ * t13,                               t.scalefactor_ * t21,                               t.scalefactor_ * t22,                               t.scalefactor_ * t23);}CGAL_END_NAMESPACE#endif // CGAL_CARTESIAN_AFF_TRANSFORMATION_REP_2_H

⌨️ 快捷键说明

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