00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_FUN_P2P_TRANSLATION_HH
00027 # define MLN_FUN_P2P_TRANSLATION_HH
00028
00032
00033 # include <mln/core/concept/function.hh>
00034 # include <mln/core/concept/gdpoint.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040 namespace fun
00041 {
00042
00043 namespace p2p
00044 {
00045
00046 template <typename P>
00047 struct translation_t : public Function_v2v< translation_t<P> >
00048 {
00049 typedef P result;
00050 typedef P argument;
00051
00052 translation_t(const mln_delta(P)& dp);
00053
00054 P operator()(const P& p) const;
00055 P inverse(const P& p) const;
00056
00057 protected:
00058 mln_delta(P) dp_;
00059 };
00060
00061
00062 template <typename D>
00063 translation_t<mln_site(D)>
00064 translation(const Gdpoint<D>& dp);
00065
00066
00067
00068 # ifndef MLN_INCLUDE_ONLY
00069
00070 template <typename P>
00071 inline
00072 translation_t<P>::translation_t(const mln_delta(P)& dp)
00073 : dp_(dp)
00074 {
00075 }
00076
00077 template <typename P>
00078 inline
00079 P
00080 translation_t<P>::operator()(const P& p) const
00081 {
00082 return p + dp_;
00083 }
00084
00085 template <typename P>
00086 inline
00087 P
00088 translation_t<P>::inverse(const P& p) const
00089 {
00090 return p - dp_;
00091 }
00092
00093
00094 template <typename D>
00095 inline
00096 translation_t<mln_site(D)>
00097 translation(const Gdpoint<D>& dp)
00098 {
00099 translation_t<mln_site(D)> tmp(exact(dp));
00100 return tmp;
00101 }
00102
00103
00104 # endif // ! MLN_INCLUDE_ONLY
00105
00106 }
00107
00108 }
00109
00110 }
00111
00112
00113 #endif // ! MLN_FUN_P2P_TRANSLATION_HH