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

📄 aff_transformationh2.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
📖 第 1 页 / 共 3 页
字号:
    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;             Scaling_repH2()             {}             Scaling_repH2(const RT& scaling_numerator,                                 const RT& scaling_denominator) :               _sf_num(scaling_numerator), _sf_den(scaling_denominator)             {               if ( scaling_denominator < RT(0)   )               {                 _sf_num = - _sf_num;                 _sf_den = - _sf_den;               };             }    virtual  ~Scaling_repH2()             {}    virtual  Point_2             transform(const Point_2 & p) const             {               return Point_2( p.hx() * _sf_num,                               p.hy() * _sf_num,                               p.hw() * _sf_den );             }    virtual  Vector_2             transform(const Vector_2 & v) const             {               return Vector_2( v.hx() * _sf_num,                                v.hy() * _sf_num,                                v.hw() * _sf_den );             }    virtual  Direction_2             transform(const Direction_2 & d) const             { return (d); }    virtual  Aff_transformationH2<R>             inverse() const             { return Aff_transformationH2<R>(SCALING, _sf_den, _sf_num); }    virtual  bool             is_even() const             { return true; }    virtual  Aff_transformation_repH2<R>             general_form() const             {               return               Aff_transformation_repH2<R>(_sf_num, RT(0)  , RT(0)  ,                                               RT(0)  , _sf_num, RT(0)  ,                                                                 _sf_den );             }    virtual  RT   homogeneous(int i, int j) const;    virtual  FT   cartesian(int i, int j) const;  private:    RT  _sf_num;    RT  _sf_den;};template < class R >class Reflection_repH2 : public Aff_transformation_rep_baseH2<R>{  public:    typedef typename R::RT RT;    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::Line_2       Line_2;             Reflection_repH2(const Line_2& l_) : l(l_) {}    virtual  ~Reflection_repH2()             {}    virtual  Point_2             transform(const Point_2 & p) const             {               Point_2 pp = l.projection(p);               return p + (pp - p)*RT(2);             }    virtual  Vector_2             transform(const Vector_2 & v) const             {               Line_2 l0( l.a(), l.b(), RT(0));               Point_2 p = ORIGIN + v;               Point_2 pp = l0.projection(p);               return (p + (pp - p)*RT(2)) - ORIGIN;             }    virtual  Direction_2             transform(const Direction_2 & d) const             { return transform( Vector_2(d) ).direction(); }    virtual  Aff_transformationH2<R>             inverse() const             {               return Aff_transformationH2<R>(                   static_cast< Aff_transformation_rep_baseH2<R>* >                   ( const_cast< Reflection_repH2<R>*> (this) )  );             }    virtual  bool             is_even() const             { return false; }    virtual  Aff_transformation_repH2<R>             general_form() const             {               const RT mRT2 = - RT(2);               const RT& a = l.a();               const RT& b = l.b();               const RT& c = l.c();               RT de = a*a + b*b;               RT aa = b*b - a*a;               RT bb = a*a - b*b;               RT ab = a*b* mRT2;               RT ac = a*c* mRT2;               RT bc = b*c* mRT2;               return               Aff_transformation_repH2<R>( aa, ab, ac,                                                ab, bb, bc,                                                        de );             }    virtual  RT   homogeneous(int i, int j) const;    virtual  FT   cartesian(int i, int j) const;  private:    Line_2   l;};template < class R_ >class Aff_transformationH2  : public Handle_for_virtual< Aff_transformation_rep_baseH2<R_> >{  typedef typename R_::FT                        FT;  typedef typename R_::RT                        RT;  typedef typename R_::Point_2      Point_2;  typedef typename R_::Vector_2     Vector_2;  typedef typename R_::Direction_2  Direction_2;  typedef typename R_::Line_2       Line_2;public:  typedef R_                                    R;          Aff_transformationH2();          // Identity:          Aff_transformationH2(const Identity_transformation);          // Translation:          Aff_transformationH2(const Translation, const Vector_2& v);          // Scaling:          Aff_transformationH2(const Scaling, const RT& a,                                 const RT& b = RT(1));          Aff_transformationH2(const Scaling, const RT& xa, const RT& xb,                                              const RT& ya, const RT& yb);          // Reflection:          Aff_transformationH2(const Reflection, const Line_2& l);          // Rational Rotation:          Aff_transformationH2(const Rotation,                               const RT& sine,                               const RT& cosine,                               const RT& denominator);          Aff_transformationH2(const Rotation,                               const Direction_2& dir,                               const RT& n,                               const RT& d = RT(1));          // Orthogonal Transformation:          Aff_transformationH2(const Vector_2& v,                               const RT& sine,                               const RT& cosine,                               const RT& denominator,                               const RT& scaling_numerator = RT(1),                               const RT& scaling_denominator = RT(1))  {    Aff_transformationH2<R>        scaling(SCALING,scaling_numerator,scaling_denominator);    Aff_transformationH2<R> combination =          Aff_transformationH2<R>(TRANSLATION, scaling.inverse().transform(-v))        * scaling        * Aff_transformationH2<R>(ROTATION, sine, cosine, denominator)        * Aff_transformationH2<R>(TRANSLATION, v ) ;    *this = combination;  }          // General affine transformation          //    | a b c |   |x|          //    | d e f | * |y|          //    | 0 0 g |   |w|          Aff_transformationH2(const RT& a, const RT& b, const RT& c,                               const RT& d, const RT& e, const RT& f,                                                         const RT& g = RT(1));          Aff_transformationH2(const RT& a, const RT& b,                               const RT& d, const RT& e,                                                         const RT& g = RT(1));    Point_2     transform(const Point_2& p) const;    Vector_2    transform(const Vector_2& v) const;    Direction_2 transform(const Direction_2& d) const;    Line_2      transform(const Line_2& l) const;    Aff_transformationH2<R> inverse() const;    bool                    is_even() const;    bool                    is_odd()  const;                            // Access functions for matrix form    FT                      cartesian(int i, int j) const;    RT                      homogeneous(int i, int j) const;    FT                      m(int i, int j) const                            { return cartesian(i,j); }    RT                      hm(int i, int j) const                            { return homogeneous(i,j); }    Aff_transformation_repH2<R>                            general_form() const;//  friend   Aff_transformationH2<R>//    operator* <>//              (const Aff_transformationH2<R>& left_argument,//               const Aff_transformationH2<R>& right_argument );    Aff_transformationH2<R>    operator*(const Aff_transformationH2<R>& right_argument ) const;};template < class R >Aff_transformationH2<R>::Aff_transformationH2(){ initialize_with(Aff_transformation_repH2<R>()); }template < class R >Aff_transformationH2<R>::Aff_transformationH2(const Identity_transformation){ initialize_with(Identity_repH2<R>()); }template < class R >Aff_transformationH2<R>::Aff_transformationH2(const Translation,	             const typename Aff_transformationH2<R>::Vector_2& v){ initialize_with(Translation_repH2<R>( v )); }template < class R >Aff_transformationH2<R>::Aff_transformationH2(const Scaling, const RT& a, const RT& b){ initialize_with(Scaling_repH2<R>( a, b)); }template < class R >Aff_transformationH2<R>::Aff_transformationH2( const Scaling, const RT& xa, const RT& xb,                                     const RT& ya, const RT& yb){  initialize_with(Aff_transformation_repH2<R>(xa*yb,  RT(0),  RT(0),                                              RT(0),  ya*xb,  RT(0),                                              xb*yb  ));}template < class R >Aff_transformationH2<R>::Aff_transformationH2(const Reflection,	             const typename Aff_transformationH2<R>::Line_2& l){ initialize_with(Reflection_repH2<R>( l)); }template < class R >Aff_transformationH2<R>::Aff_transformationH2(const Rotation,                     const RT& sine,                     const RT& cosine,                     const RT& denominator){ initialize_with(Rotation_repH2<R>(sine, cosine, denominator)); }template < class R >Aff_transformationH2<R>::Aff_transformationH2(const Rotation,                     const typename Aff_transformationH2<R>::Direction_2& dir,                     const RT& n,                     const RT& d){ const RT   RTzero = RT(0)  ; CGAL_kernel_precondition( n > RTzero ); CGAL_kernel_precondition( d > RTzero ); RT   sin; RT   cos; RT   den; rational_rotation_approximation(dir.x(), dir.y(), sin, cos, den, n, d); initialize_with(Rotation_repH2<R>( sin, cos, den ));}template < class R >Aff_transformationH2<R>::Aff_transformationH2( const RT& a, const RT& b, const RT& c,                      const RT& d, const RT& e, const RT& f,                                                const RT& g){  initialize_with(Aff_transformation_repH2<R>( a,   b,   c,                                               d,   e,   f,                                               g  ));}template < class R >Aff_transformationH2<R>::Aff_transformationH2( const RT& a, const RT& b,                      const RT& d, const RT& e,                      const RT& g){  initialize_with(Aff_transformation_repH2<R>( a,   b,   RT(0),                                               d,   e,   RT(0),                                               g  ));}template < class R >typename Aff_transformationH2<R>::Point_2Aff_transformationH2<R>::transform(const typename Aff_transformationH2<R>::Point_2& p) const{ return this->Ptr()->transform(p); }template < class R >typename Aff_transformationH2<R>::Vector_2Aff_transformationH2<R>::transform( const typename Aff_transformationH2<R>::Vector_2& v) const{ return this->Ptr()->transform(v); }template < class R >typename Aff_transformationH2<R>::Direction_2Aff_transformationH2<R>::

⌨️ 快捷键说明

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