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

📄 aff_transformation_rep_3.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_3.h $// $Id: Aff_transformation_rep_3.h 28567 2006-02-16 14:30:13Z lsaboret $// //// Author(s)     : Herve Bronnimann#ifndef CGAL_CARTESIAN_AFF_TRANSFORMATION_REP_3_H#define CGAL_CARTESIAN_AFF_TRANSFORMATION_REP_3_H#include <CGAL/determinant.h>CGAL_BEGIN_NAMESPACEtemplate < class R >class Aff_transformation_rep_baseC3  : public Ref_counted_virtual{public:  typedef typename R::FT                   FT;  typedef typename R::Point_3              Point_3;  typedef typename R::Vector_3             Vector_3;  typedef typename R::Direction_3          Direction_3;  typedef typename R::Aff_transformation_3 Aff_transformation_3;  virtual ~Aff_transformation_rep_baseC3(){}  virtual Point_3     transform(const Point_3 &p) const = 0;  virtual Vector_3    transform(const Vector_3 &v) const = 0;  virtual Direction_3 transform(const Direction_3 &d) const = 0;  virtual Aff_transformation_3 operator*(                       const Aff_transformation_rep_baseC3 &t) const = 0;  virtual Aff_transformation_3 compose(                       const Translation_repC3<R> &t) const  = 0;  virtual Aff_transformation_3 compose(                       const Scaling_repC3<R> &t) const  = 0;  virtual Aff_transformation_3 compose(                       const Aff_transformation_repC3<R> &t) const  = 0;  virtual Aff_transformation_3 inverse() const = 0;  virtual Aff_transformation_3 transpose() 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_repC3  : public Aff_transformation_rep_baseC3<R>{  friend class Translation_repC3<R>;  friend class Scaling_repC3<R>;public:  typedef typename R::FT                                FT;  typedef Aff_transformation_repC3<R>                   Self;  typedef Aff_transformation_rep_baseC3<R>              Transformation_base_3;  typedef Aff_transformation_repC3<R>                   Transformation_3;  typedef Translation_repC3<R>                          Translation_3;  typedef Scaling_repC3<R>                              Scaling_3;  typedef typename Transformation_base_3::Point_3       Point_3;  typedef typename Transformation_base_3::Vector_3      Vector_3;  typedef typename Transformation_base_3::Direction_3   Direction_3;  typedef typename Transformation_base_3::	                           Aff_transformation_3 Aff_transformation_3;  Aff_transformation_repC3()  {}  Aff_transformation_repC3(const FT& m11, const FT& m12, const FT& m13,                           const FT& m21, const FT& m22, const FT& m23,                           const FT& m31, const FT& m32, const FT& m33)    : t11(m11), t12(m12), t13(m13), t14(FT(0)),      t21(m21), t22(m22), t23(m23), t24(FT(0)),      t31(m31), t32(m32), t33(m33), t34(FT(0))  {}  Aff_transformation_repC3(     const FT& m11, const FT& m12, const FT& m13, const FT& m14,     const FT& m21, const FT& m22, const FT& m23, const FT& m24,     const FT& m31, const FT& m32, const FT& m33, const FT& m34  )    : t11(m11), t12(m12), t13(m13), t14(m14),      t21(m21), t22(m22), t23(m23), t24(m24),      t31(m31), t32(m32), t33(m33), t34(m34)  {}  virtual ~Aff_transformation_repC3()  {}  virtual Point_3 transform(const Point_3& p) const // FIXME : construction  {    typename R::Construct_point_3 construct_point_3;    return construct_point_3(t11 * p.x() + t12 * p.y() + t13 * p.z() + t14,			     t21 * p.x() + t22 * p.y() + t23 * p.z() + t24,			     t31 * p.x() + t32 * p.y() + t33 * p.z() + t34);  }  // note that a vector is not translated  virtual Vector_3 transform(const Vector_3& v) const // FIXME : construction  {    return Vector_3(t11 * v.x() + t12 * v.y() + t13 * v.z(),                    t21 * v.x() + t22 * v.y() + t23 * v.z(),                    t31 * v.x() + t32 * v.y() + t33 * v.z());  }  // note that a direction is not translated  virtual Direction_3 transform(const Direction_3& dir) const  { // FIXME : construction    Vector_3 v = dir.to_vector();    return Direction_3(t11 * v.x() + t12 * v.y() + t13 * v.z(),                       t21 * v.x() + t22 * v.y() + t23 * v.z(),                       t31 * v.x() + t32 * v.y() + t33 * v.z());  }  // Note that Aff_transformation is not defined yet,  // so the following 6 functions have to be implemented  // outside class body  virtual Aff_transformation_3 inverse() const;  virtual Aff_transformation_3 transpose() const;  virtual Aff_transformation_3 operator*(const Transformation_base_3 &t) const;  virtual Aff_transformation_3 compose(const Transformation_3 &t) const;  virtual Aff_transformation_3 compose(const Translation_3 &t) const;  virtual Aff_transformation_3 compose(const Scaling_3 &t) const;       virtual bool is_even() const  {    return sign_of_determinant3x3(t11, t12, t13,                                  t21, t22, t23,                                  t31, t32, t33) == POSITIVE;  }  virtual 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 3: return t14;            }    case 1: switch (j)            {              case 0: return t21;              case 1: return t22;              case 2: return t23;              case 3: return t24;            }    case 2: switch (j)            {              case 0: return t31;              case 1: return t32;              case 2: return t33;              case 3: return t34;            }    case 3: switch (j)            {              case 0: return FT(0);              case 1: return FT(0);              case 2: return FT(0);              case 3: return FT(1);            }    }  return FT(0);  }  virtual std::ostream &print(std::ostream &os) const  {    os <<"Aff_transformationC3("<<t11<<' '<<t12<<' '<<t13<<' '<<t14<<std::endl;    os <<"                    "<< t21<<' '<<t22<<' '<<t23<<' '<<t24<<std::endl;    os <<"                    "<< t31<<' '<<t32<<' '<<t33<<' '<<t34<<")";    return os;  }private:  FT   t11, t12, t13, t14; // FIXME : Wouldn't this be better with an array ?  FT   t21, t22, t23, t24;  FT   t31, t32, t33, t34;};template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC3<R>::Aff_transformation_3Aff_transformation_repC3<R>::inverse() const // FIXME : construction{  return Aff_transformation_3(      det2x2_by_formula( t22, t23, t32, t33),         // i 11     -det2x2_by_formula( t12, t13, t32, t33),         // i 12      det2x2_by_formula( t12, t13, t22, t23),         // i 13     -det3x3_by_formula( t12, t13, t14, t22, t23, t24, t32, t33, t34 ),     -det2x2_by_formula( t21, t23, t31, t33),         // i 21       det2x2_by_formula( t11, t13, t31, t33),         // i 22     -det2x2_by_formula( t11, t13, t21, t23),         // i 23      det3x3_by_formula( t11, t13, t14, t21, t23, t24, t31, t33, t34 ),      det2x2_by_formula( t21, t22, t31, t32),         // i 31     -det2x2_by_formula( t11, t12, t31, t32),         // i 32      det2x2_by_formula( t11, t12, t21, t22),         // i 33     -det3x3_by_formula( t11, t12, t14, t21, t22, t24, t31, t32, t34 ),      det3x3_by_formula( t11, t12, t13, t21, t22, t23, t31, t32, t33 ));}template < class R >CGAL_KERNEL_INLINEtypename Aff_transformation_repC3<R>::Aff_transformation_3Aff_transformation_repC3<R>::operator*(const Aff_transformation_rep_baseC3<R> &t) const{  return t.compose(*this);}template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC3<R>::Aff_transformation_3Aff_transformation_repC3<R>::compose(const Aff_transformation_repC3<R> &t) const // FIXME : construction{  return Aff_transformation_3(t.t11*t11 + t.t12*t21 + t.t13*t31,                              t.t11*t12 + t.t12*t22 + t.t13*t32,                              t.t11*t13 + t.t12*t23 + t.t13*t33,                              t.t11*t14 + t.t12*t24 + t.t13*t34 + t.t14,                              t.t21*t11 + t.t22*t21 + t.t23*t31,                              t.t21*t12 + t.t22*t22 + t.t23*t32,                              t.t21*t13 + t.t22*t23 + t.t23*t33,                              t.t21*t14 + t.t22*t24 + t.t23*t34 + t.t24,                              t.t31*t11 + t.t32*t21 + t.t33*t31,                              t.t31*t12 + t.t32*t22 + t.t33*t32,                              t.t31*t13 + t.t32*t23 + t.t33*t33,                              t.t31*t14 + t.t32*t24 + t.t33*t34 + t.t34);}template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC3<R>::Aff_transformation_3Aff_transformation_repC3<R>::compose(const Translation_repC3<R> &t) const // FIXME : construction{  return Aff_transformation_3(t11,                              t12,                              t13,                              t14 + t.translationvector_.x(),                              t21,                              t22,                              t23,                              t24 + t.translationvector_.y(),                              t31,                              t32,                              t33,                              t34 + t.translationvector_.z());}template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC3<R>::Aff_transformation_3Aff_transformation_repC3<R>::compose(const Scaling_repC3<R> &t) const // FIXME : construction{  return Aff_transformation_3(t.scalefactor_ * t11,                              t.scalefactor_ * t12,                              t.scalefactor_ * t13,                              t.scalefactor_ * t14,			                                    t.scalefactor_ * t21,                              t.scalefactor_ * t22,                              t.scalefactor_ * t23,                              t.scalefactor_ * t24,                              			      t.scalefactor_ * t31,                              t.scalefactor_ * t32,                              t.scalefactor_ * t33,                              t.scalefactor_ * t34);}template < class R >CGAL_KERNEL_LARGE_INLINEtypename Aff_transformation_repC3<R>::Aff_transformation_3Aff_transformation_repC3<R>::transpose() const{  return Aff_transformation_3( t11, t21, t31, t14,                               t12, t22, t32, t24,                               t13, t23, t33, t34);}CGAL_END_NAMESPACE#endif // CGAL_CARTESIAN_AFF_TRANSFORMATION_REP_3_H

⌨️ 快捷键说明

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