source: Sophya/trunk/SophyaLib/SkyMap/localmap.h@ 1419

Last change on this file since 1419 was 1419, checked in by lemeur, 25 years ago

surcharge d'operateurs =, +=, *= etc...

File size: 8.8 KB
RevLine 
[764]1// This may look like C code, but it is really -*- C++ -*-
2#ifndef LOCALMAP_SEEN
3#define LOCALMAP_SEEN
4
5#include "pixelmap.h"
6#include "sphericalmap.h"
7#include "ndatablock.h"
8
9#include "anydataobj.h"
10#include "ppersist.h"
11
12
13
14// ***************** Class LocalMap *****************************
15
[841]16
17
18namespace SOPHYA {
19
20
[1217]21/* Class LocalMap */
22
23
[764]24template<class T>
25class LocalMap : public PixelMap<T>
26{
27
28public:
29
30LocalMap();
31LocalMap(int_4 nx, int_4 ny);
[917]32LocalMap(const LocalMap<T>& lm, bool share);
[908]33LocalMap(const LocalMap<T>& lm);
[764]34virtual ~LocalMap();
35
[908]36inline virtual bool IsTemp(void) const { return pixels_.IsTemp();}
[1217]37
[764]38/*! Setting blockdata to temporary (see ndatablock documentation) */
39inline virtual void SetTemp(bool temp=false) const {pixels_.SetTemp(temp);};
40
41
42// ---------- Overloading of () to access pixel number k ----
43
44inline T& operator()(int_4 k) {return(PixVal(k));}
45inline T const& operator()(int_4 k) const {return(PixVal(k));}
46inline T& operator()(int_4 ix, int_4 iy) {return PixVal(iy*nSzX_+ix);};
47inline T const& operator()(int_4 ix, int_4 iy) const {return PixVal(iy*nSzX_+ix);};
48
49// ---------- Definition of PixelMap abstract methods -------
50
51virtual int_4 NbPixels() const; // D.Y. int change en int_4 rationalisation Mac
52
53virtual T& PixVal(int_4 k);
54virtual T const& PixVal(int_4 k) const;
55
56virtual bool ContainsSph(double theta, double phi) const;
57virtual int_4 PixIndexSph(double theta,double phi) const;
58
59virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
60
61virtual T SetPixels(T v);
62
63virtual double PixSolAngle(int_4 k) const;
64
65// ---------- Specific methods ------------------------------
66
67void ReSize(int_4 nx, int_4 ny);
68
69inline virtual char* TypeOfMap() const {return "LOCAL";};
70
71virtual void SetOrigin(double theta=90.,double phi=0.,double angle=0.);
72virtual void SetOrigin(double theta,double phi,int_4 x0,int_4 y0,double angle=0.);
73
74virtual void SetSize(double angleX,double angleY);
75
[1217]76/*! Check to see if the local mapping is done */
[764]77inline bool LocalMap_isDone() const {return(originFlag_ && extensFlag_);};
78
79virtual void Project(SphericalMap<T>& sphere) const;
80
81/* There should be a more complex algorithm somewhere to combine *several* local maps to a full sphere.
82 -> static method, or separate class */
83
[1217]84/*! provides a integer characterizing the pixelization refinement (here : number of pixels) */
[764]85inline virtual int_4 SizeIndex() const {return(nPix_);}
86inline int_4 Size_x() const {return nSzX_;}
87inline int_4 Size_y() const {return nSzY_;}
88
[1163]89/* Je rajoute ces 2 fonctions inlines pour compatibilite d'interface
90 avec TArray - Reza 30/8/2000 */
91inline int_4 SizeX() const {return nSzX_;}
92inline int_4 SizeY() const {return nSzY_;}
93
[764]94inline void Origin(double& theta,double& phi,int_4& x0,int_4& y0,double& angle) const {theta= theta0_; phi= phi0_; x0= x0_; y0= y0_;angle= angle_;}
95
96inline void Aperture(double& anglex,double& angley) const {anglex= angleX_; angley= angleY_;}
97
98
99/* Acces to the DataBlock */
100inline NDataBlock<T>& DataBlock() {return pixels_;}
101inline const NDataBlock<T>& DataBlock() const {return pixels_;}
102
103/* impression */
104void print(ostream& os) const;
105
[1419]106// Operations diverses = , +=, ...
107
108
109virtual LocalMap<T>& Set(const LocalMap<T>& a);
[908]110inline LocalMap<T>& operator = (const LocalMap<T>& a) {return Set(a);}
111
[1419]112// A += -= *= /= x (ajoute, soustrait, ... x a tous les elements)
[908]113
[1419]114 //! Fill LocalMap with all elements equal to \b x
115virtual LocalMap<T>& SetT(T a);
116inline LocalMap<T>& operator = (T a) {return SetT(a);}
[908]117
[1419]118//! Add \b x to all elements
119virtual LocalMap<T>& Add(T a);
120inline LocalMap<T>& operator += (T x) { return Add(x); }
121//! Substract \b x to all elements
122virtual LocalMap<T>& Sub(T a);
123inline LocalMap<T>& operator -= (T x) { return Sub(x); }
124//! Multiply all elements by \b x
125virtual LocalMap<T>& Mul(T a);
126inline LocalMap<T>& operator *= (T x) { return Mul(x); }
127//! Divide all elements by \b x
128virtual LocalMap<T>& Div(T a);
129inline LocalMap<T>& operator /= (T x) { return Div(x); }
130
131// A += -= (ajoute, soustrait element par element les deux spheres )
132 //! Operator LocalMap += LocalMap
133 virtual LocalMap<T>& AddElt(const LocalMap<T>& a);
134 inline LocalMap<T>& operator += (const LocalMap<T>& a) { return AddElt(a); }
135
136
137
138 virtual LocalMap<T>& SubElt(const LocalMap<T>& a);
139 //! Operator LocalMap -= LocalMap
140 inline LocalMap<T>& operator -= (const LocalMap<T>& a) { return SubElt(a); }
141// Multiplication, division element par element les deux LocalMap
142 virtual LocalMap<T>& MulElt(const LocalMap<T>& a);
143 inline LocalMap<T>& operator *= (const LocalMap<T>& a) { return MulElt(a); }
144
145
146void CloneOrShare(const LocalMap<T>& a);
147void Share(const LocalMap<T>& a);
148LocalMap<T>& CopyElt(const LocalMap<T>& a);
149
150
[764]151// ---------- Méthodes internes -----------------------------
152
153private :
154
155void InitNul();
156void Getij(int_4 k,int_4& i,int_4& j) const;
157void ReferenceToUser(double& theta,double& phi) const;
158void UserToReference(double& theta,double& phi) const;
159void PixProjToAngle(double x,double y,double& theta,double& phi) const;
160void AngleProjToPix(double theta,double phi,double& x,double& y) const;
161
[908]162void recopierVariablesSimples(const LocalMap<T>& lm);
163
164
[764]165// ---------- Variables internes ----------------------------
166
167int_4 nSzX_;
168int_4 nSzY_;
169int_4 nPix_;
170bool originFlag_;
171bool extensFlag_;
172int_4 x0_;
173int_4 y0_;
174double theta0_;
175double phi0_;
176double angle_;
177double cos_angle_;
178double sin_angle_;
179double angleX_;
180double angleY_;
181double tgAngleX_;
182double tgAngleY_;
183NDataBlock<T> pixels_;
184};
185
[1419]186////////////////////////////////////////////////////////////////
187// Surcharge d'operateurs A (+,-,*,/) (T) x
188/*! \ingroup LocalMap \fn operator+(const LocalMap<T>&,T)
189 \brief Operator LocalMap = LocalMap + constant */
190template <class T> inline LocalMap<T> operator + (const LocalMap<T>& a, T b)
191 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
192 result.Add(b); return result;}
193/*! \ingroup LocalMap \fn operator+(T,const LocalMap<T>&)
194 \brief Operator LocalMap = constant + LocalMap */
195template <class T> inline LocalMap<T> operator + (T b,const LocalMap<T>& a)
196 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
197 result.Add(b); return result;}
[764]198
199
[1419]200/*! \ingroup LocalMap\fn operator-(const LocalMap<T>&,T)
201 \brief Operator LocalMap = LocalMap - constant */
202template <class T> inline LocalMap<T> operator - (const LocalMap<T>& a, T b)
203 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
204 result.Sub(b); return result;}
205
206/*! \ingroup \fn operator-(T,const LocalMap<T>&)
207 \brief Operator LocalMap = constant - LocalMap */
208template <class T> inline LocalMap<T> operator - (T b,const LocalMap<T>& a)
209 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
210 result.Sub(b,true); return result;}
211
212/*! \ingroup LocalMap \fn operator*(const LocalMap<T>&,T)
213 \brief Operator LocalMap = LocalMap * constant */
214template <class T> inline LocalMap<T> operator * (const LocalMap<T>& a, T b)
215 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
216 result.Mul(b); return result;}
217
218/*! \ingroup LocalMap \fn operator*(T,const LocalMap<T>&)
219 \brief Operator LocalMap = constant * LocalMap */
220template <class T> inline LocalMap<T> operator * (T b,const LocalMap<T>& a)
221 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
222 result.Mul(b); return result;}
223
224/*! \ingroup LocalMap \fn operator/(const LocalMap<T>&,T)
225 \brief Operator LocalMap = LocalMap / constant */
226template <class T> inline LocalMap<T> operator / (const LocalMap<T>& a, T b)
227 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
228 result.Div(b); return result;}
229
230/*! \ingroup LocalMap \fn operator/(T,const LocalMap<T>&)
231 \brief Operator LocalMap = constant / LocalMap */
232template <class T> inline LocalMap<T> operator / (T b, const LocalMap<T>& a)
233 {LocalMap<T> result; result.CloneOrShare(a); result.SetTemp(true);
234 result.Div(b, true); return result;}
235
236////////////////////////////////////////////////////////////////
237// Surcharge d'operateurs C = A (+,-) B
238
239/*! \ingroup LocalMap \fn operator+(const LocalMap<T>&,const LocalMap<T>&)
240 \brief Operator LocalMap = LocalMap + LocalMap */
241template <class T>
242inline LocalMap<T> operator + (const LocalMap<T>& a,const LocalMap<T>& b)
243 { LocalMap<T> result; result.SetTemp(true);
244 if (b.IsTemp()) { result.Share(b); result.AddElt(a); }
245 else { result.CloneOrShare(a); result.AddElt(b); }
246 return result; }
247
248/*! \ingroup LocalMap \fn operator-(const LocalMap<T>&,const LocalMap<T>&)
249 \brief Operator LocalMap = LocalMap - LocalMap */
250template <class T>
251inline LocalMap<T> operator - (const LocalMap<T>& a,const LocalMap<T>& b)
252 { LocalMap<T> result; result.SetTemp(true);
253 if (b.IsTemp()) { result.Share(b); result.SubElt(a, true); }
254 else { result.CloneOrShare(a); result.SubElt(b); }
255 return result; }
256
257
[841]258} // Fin du namespace
[764]259
260#endif
Note: See TracBrowser for help on using the repository browser.