25 template<
class Tsource,
class Tdest>
31 using component_source_t =
typename SourceProp::component_type;
32 using component_dest_t =
typename DestProp::component_type;
34 static constexpr bool source_is_int = SourceProp::is_uint_based;
36 static constexpr bool dest_is_int = SourceProp::is_uint_based;
38 enum TransformFactMode { multiply, divide };
44 Tsource source_coord_min;
46 TransformFactMode mode;
50 SourceProp::dimension == DestProp::dimension,
51 "input and output dimensions should be the same");
58 Tdest transform(Tsource coord)
const;
59 Tsource reverse_transform(Tdest rnge)
const;
61 void print_transform()
const;
68 template<
class Tsource,
class Tdest>
72 Tsource pmin = rnge.lower;
73 Tsource pmax = rnge.upper;
75 if (mode == multiply) {
77 sham::convert<Tdest>(pmin - source_coord_min) * fact + dest_coord_min,
78 sham::convert<Tdest>(pmax - source_coord_min) * fact + dest_coord_min};
81 sham::convert<Tdest>(pmin - source_coord_min) / fact + dest_coord_min,
82 sham::convert<Tdest>(pmax - source_coord_min) / fact + dest_coord_min};
86 template<
class Tsource,
class Tdest>
87 inline CoordRange<Tsource> CoordRangeTransform<Tsource, Tdest>::reverse_transform(
88 CoordRange<Tdest> rnge)
const {
93 if (mode == multiply) {
95 sham::convert<Tsource>((rnge.lower - dest_coord_min) / fact) + source_coord_min,
96 sham::convert<Tsource>((rnge.upper - dest_coord_min) / fact) + source_coord_min};
99 sham::convert<Tsource>((rnge.lower - dest_coord_min) * fact) + source_coord_min,
100 sham::convert<Tsource>((rnge.upper - dest_coord_min) * fact) + source_coord_min};
104 template<
class Tsource,
class Tdest>
105 inline Tdest CoordRangeTransform<Tsource, Tdest>::transform(Tsource coord)
const {
107 if (mode == multiply) {
108 return sham::convert<Tdest>(coord - source_coord_min) * fact + dest_coord_min;
110 return sham::convert<Tdest>(coord - source_coord_min) / fact + dest_coord_min;
114 template<
class Tsource,
class Tdest>
115 inline Tsource CoordRangeTransform<Tsource, Tdest>::reverse_transform(Tdest coord)
const {
117 if (mode == multiply) {
118 return sham::convert<Tsource>((coord - dest_coord_min) / fact) + source_coord_min;
120 return sham::convert<Tsource>((coord - dest_coord_min) * fact) + source_coord_min;
namespace for math utility