00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef IMG_ALG_TRANSFORM_ALG_TRANSFORM_HH
00022 #define IMG_ALG_TRANSFORM_ALG_TRANSFORM_HH
00023
00024 #include <ost/img/image_state.hh>
00025 #include <ost/img/value_util.hh>
00026 #include "transformations.hh"
00027 #include <ost/img/alg/module_config.hh>
00028
00029 namespace ost { namespace img { namespace alg {
00030
00031 struct DLLEXPORT_IMG_ALG TransformFnc {
00032
00033 TransformFnc(): tf_() {}
00034 TransformFnc(const Transformation& tf, const Vec3 o=Vec3(0.0,0.0,0.0)): tf_(tf), offset_(o) {}
00035
00036 template <typename T, class D>
00037 ImageStateBasePtr VisitState(const ImageStateImpl<T,D>& isi) const {
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 boost::shared_ptr<ImageStateImpl<T,D> > nisi = isi.CloneState(false);
00048
00049 Mat4 imat = tf_.InverseMatrix();
00050
00051 if(offset_==Vec3(0.0,0.0,0.0)) {
00052 for(ExtentIterator it(nisi->GetExtent()); !it.AtEnd(); ++it) {
00053 Point p(it);
00054 Vec3 vold_norm=Vec3(imat * Vec4(p.ToVec3()));
00055 nisi->Value(it) = isi.CalcIntpolValue(vold_norm);
00056 }
00057 } else {
00058 for(ExtentIterator it(nisi->GetExtent()); !it.AtEnd(); ++it) {
00059 Point p(it);
00060 Vec3 vold_norm=Vec3(imat * Vec4(p.ToVec3()-offset_))+offset_;
00061 nisi->Value(it) = isi.CalcIntpolValue(vold_norm);
00062 }
00063 }
00064
00065 return nisi;
00066 }
00067
00068 static String GetAlgorithmName() {return "Transform";}
00069
00070 private:
00071 Transformation tf_;
00072 Vec3 offset_;
00073 };
00074
00075 typedef ImageStateConstModOPAlgorithm<TransformFnc> Transform;
00076
00077 }}}
00078
00079 #endif
00080