00001 #ifndef RECTANGLE_WARPER_CLASS
00002 #define RECTANGLE_WARPER_CLASS
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00019
00028 #include "rectangle.h"
00029
00030 namespace geometric {
00031
00032 template <class numeric_type>
00033 class rectangle_warper
00034 {
00035 public:
00037
00043 enum origin_vertex { BOTTOM_LEFT, TOP_LEFT, TOP_RIGHT, BOTTOM_RIGHT };
00044
00045 rectangle_warper(const rectangle<numeric_type> &system_1,
00046 const rectangle<numeric_type> &system_2,
00047 origin_vertex system_1_origin = BOTTOM_LEFT,
00048 origin_vertex system_2_origin = BOTTOM_LEFT);
00050
00054 ~rectangle_warper();
00055
00056 point<numeric_type> to_system_1(const point<numeric_type> &in_system_2) const;
00058
00062 point<numeric_type> to_system_2(const point<numeric_type> &in_system_1) const;
00064
00068 rectangle<numeric_type> to_system_1
00069 (const rectangle<numeric_type> &in_system_2) const;
00071 rectangle<numeric_type> to_system_2
00072 (const rectangle<numeric_type> &in_system_1) const;
00074
00075 rectangle<numeric_type> system_1() const { return _system_1; }
00076 rectangle<numeric_type> system_2() const { return _system_2; }
00077 origin_vertex origin_1() const { return _vert_1; }
00078 origin_vertex origin_2() const { return _vert_2; }
00079
00080 void system_1(const rectangle<numeric_type> &to_set,
00081 origin_vertex origin_corner = BOTTOM_LEFT);
00082 void system_2(const rectangle<numeric_type> &to_set,
00083 origin_vertex origin_corner = BOTTOM_LEFT);
00084
00085 istring text_form() const;
00087
00088 istring vertex_name(origin_vertex v) const;
00090
00091 enum vertical_component { RW_BOTTOM, RW_TOP };
00092 enum horizontal_component { RW_LEFT, RW_RIGHT };
00093
00094 void separate_vertical(origin_vertex v, vertical_component &to_set) const;
00095 void separate_horizontal(origin_vertex v, horizontal_component &to_set) const;
00097
00098 private:
00099 rectangle<numeric_type> _system_1;
00100 rectangle<numeric_type> _system_2;
00101 origin_vertex _vert_1;
00102 origin_vertex _vert_2;
00103
00104 point<numeric_type> scale_point(const rectangle<numeric_type> &source,
00105 const rectangle<numeric_type> &target,
00106 origin_vertex v1, origin_vertex v2,
00107 const point<numeric_type> &old) const;
00108 rectangle<numeric_type> scale_rectangle(const rectangle<numeric_type> &source,
00109 const rectangle<numeric_type> &target,
00110 origin_vertex v1, origin_vertex v2,
00111 const rectangle<numeric_type> &old) const;
00112 rectangle<numeric_type> flip_accordingly
00113 (const rectangle<numeric_type> &to_flip, origin_vertex to_flip_origin,
00114 origin_vertex target_origin) const;
00116
00119 };
00120
00121 }
00122
00123 #endif
00124