📄 aff_transformationh2.h
字号:
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 + -