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

Last change on this file since 919 was 917, checked in by ansari, 25 years ago

Petite erreur d'argument par defaut - Reza 13/4/2000

File size: 8.3 KB
Line 
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//! A local map of a region of the sky, in cartesian coordinates.
13/*! A local map has an origin in (theta0, phi0), mapped to pixel(x0, y0)
14 (x0, y0 might be outside of this local map)
15 default value of (x0, y0) is middle of the map, center of pixel(nx/2, ny/2)
16 A local map is a 2 dimensional array, with i as column index and j
17 as row index. The map is supposed to lie on a plan tangent to the
18 celestial sphere in a point whose coordinates are (x0,y0) on the local
19 map and (theta0, phi0) on the sphere. The range of the map is defined
20 by two values of angles covered respectively by all the pixels in
21 x direction and all the pixels in y direction (SetSize()).
22
23 A "reference plane" is considered : this plane is tangent to the
24 celestial sphere in a point with angles theta=Pi/2 and phi=0. This
25 point is the origine of coordinates is of the reference plane. The
26 x-axis is the tangent parallel to the equatorial line and oriented
27 toward the increasing phi's ; the y-axis is parallel to the meridian
28 line and oriented toward the north pole.
29
30 Internally, a map is first defined within this reference plane and
31 tranported until the point (theta0, phi0) in such a way that both
32 axes are kept parallel to meridian and parallel lines of the sphere.
33 The user can define its own map with axes rotated with respect to
34 reference axes (this rotation is characterized by angle between
35 the local parallel line and the wanted x-axis-- see method
36 SetOrigin(...))
37*/
38//
39// la carte est consideree comme un tableau a deux indices i et j, i etant
40// indice de colonne et j indice de ligne. La carte est supposee resider
41// dans un plan tangent, dont le point de tangence est repere (x0,y0) dans
42// la carte et (theta0, phi0) sur la sphere celeste. L extension de la
43// carte est definie par les valeurs de deux angles couverts respectivement
44// par la totalite des pixels en x de la carte et la totalite des pixels
45// en y. (SetSize()).
46// On considere un "plan de reference" : plan tangent a la sphere celeste
47// aux angles theta=Pi/2 et phi=0. Dans ce plan L origine des coordonnees
48// est le point de tangence. L axe Ox est la tangente parallele a
49// lequateur, dirige vers les phi croissants, l axe Oy est parallele
50// au meridien, dirige vers le pole nord.
51// De maniere interne a la classe une carte est definie dans ce plan de
52// reference et transportee jusqu au point (theta0, phi0) de sorte que les // axes restent paralleles aux meridiens et paralleles. L utilisateur peut
53// definir sa carte selon un repere en rotation par rapport au repere de
54// reference (par l angle entre le parallele et l axe Ox souhaite --
55// methode SetOrigin(...))
56
57
58// ***************** Class LocalMap *****************************
59
60
61
62namespace SOPHYA {
63
64
65template<class T>
66class LocalMap : public PixelMap<T>
67{
68
69public:
70
71LocalMap();
72LocalMap(int_4 nx, int_4 ny);
73LocalMap(const LocalMap<T>& lm, bool share);
74LocalMap(const LocalMap<T>& lm);
75virtual ~LocalMap();
76
77inline virtual bool IsTemp(void) const { return pixels_.IsTemp();}
78/*! Setting blockdata to temporary (see ndatablock documentation) */
79inline virtual void SetTemp(bool temp=false) const {pixels_.SetTemp(temp);};
80
81
82// ---------- Overloading of () to access pixel number k ----
83
84inline T& operator()(int_4 k) {return(PixVal(k));}
85inline T const& operator()(int_4 k) const {return(PixVal(k));}
86inline T& operator()(int_4 ix, int_4 iy) {return PixVal(iy*nSzX_+ix);};
87inline T const& operator()(int_4 ix, int_4 iy) const {return PixVal(iy*nSzX_+ix);};
88
89// ---------- Definition of PixelMap abstract methods -------
90
91/* return/set the number of pixels */
92/*! Return number of pixels */
93virtual int_4 NbPixels() const; // D.Y. int change en int_4 rationalisation Mac
94
95/* return the value of pixel number k */
96/*! Return value of pixel with index k */
97virtual T& PixVal(int_4 k);
98/*! const version of previous method */
99virtual T const& PixVal(int_4 k) const;
100
101/* Return true if teta,phi in map */
102virtual bool ContainsSph(double theta, double phi) const;
103/* return the index of pixel at (theta,phi) */
104/*! Return index of the pixel with spherical coordinates (theta,phi) */
105virtual int_4 PixIndexSph(double theta,double phi) const;
106
107/* return the spherical coordinates of center of pixel number k */
108/*! Return (theta, phi) coordinates of pixel with index k */
109virtual void PixThetaPhi(int_4 k,double& theta,double& phi) const;
110
111/*! Set all pixels to value v */
112virtual T SetPixels(T v);
113
114/* return the Pixel Solid angle (steradians) */
115/*! Pixel Solid angle (steradians)
116
117 All the pixels have not necessarly the same size in (theta, phi)
118 because of the projection scheme which is not yet fixed.
119*/
120virtual double PixSolAngle(int_4 k) const;
121
122// ---------- Specific methods ------------------------------
123
124/*! Resize storage area for pixels */
125void ReSize(int_4 nx, int_4 ny);
126
127inline virtual char* TypeOfMap() const {return "LOCAL";};
128
129/* Origin (with angle between x axis and phi axis, in degrees) x0,y0 the default: middle of map*/
130/*! set the referential of the map (angles in degrees)
131
132 (default x0=siz_x/2, y0=siz_y/2)
133*/
134virtual void SetOrigin(double theta=90.,double phi=0.,double angle=0.);
135/*! set the referential of the map (angles in degrees) */
136virtual void SetOrigin(double theta,double phi,int_4 x0,int_4 y0,double angle=0.);
137
138/* Pixel size (degres) */
139/*! angle range of tthe map (angles in degrees) */
140virtual void SetSize(double angleX,double angleY);
141
142/* Check to see if the local mapping is done */
143inline bool LocalMap_isDone() const {return(originFlag_ && extensFlag_);};
144
145/*! Projection to a spherical map */
146virtual void Project(SphericalMap<T>& sphere) const;
147
148/* There should be a more complex algorithm somewhere to combine *several* local maps to a full sphere.
149 -> static method, or separate class */
150
151/* provides a integer characterizing the pixelization refinement (here : number of pixels) */
152inline virtual int_4 SizeIndex() const {return(nPix_);}
153inline int_4 Size_x() const {return nSzX_;}
154inline int_4 XSize() const {return nSzX_;}
155inline int_4 Size_y() const {return nSzY_;}
156inline int_4 YSize() const {return nSzY_;}
157
158inline 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_;}
159
160inline void Aperture(double& anglex,double& angley) const {anglex= angleX_; angley= angleY_;}
161
162
163/* Acces to the DataBlock */
164inline NDataBlock<T>& DataBlock() {return pixels_;}
165inline const NDataBlock<T>& DataBlock() const {return pixels_;}
166
167/* impression */
168void print(ostream& os) const;
169
170inline LocalMap<T>& operator = (const LocalMap<T>& a) {return Set(a);}
171
172
173
174// ---------- Méthodes internes -----------------------------
175
176private :
177
178void InitNul();
179/*! Return 2 indices corresponding to the pixel number k */
180void Getij(int_4 k,int_4& i,int_4& j) const;
181/*! Transform a pair of coordinates (theta, phi) given in
182 reference coordinates into map coordinates
183*/
184void ReferenceToUser(double& theta,double& phi) const;
185/*! Transform a pair of coordinates (theta, phi) given in
186 map coordinates into reference coordinates
187*/
188void UserToReference(double& theta,double& phi) const;
189/*! Given coordinates in pixel units in the REFERENCE PLANE, return
190 (theta, phi) in "absolute" referential theta=pi/2 ,phi=0.
191*/
192void PixProjToAngle(double x,double y,double& theta,double& phi) const;
193/*! Given coordinates (theta, phi) in "absolute" referential
194 theta=pi/2 ,phi=0 return pixel indices (i,j) in the REFERENCE PLANE.
195*/
196void AngleProjToPix(double theta,double phi,double& x,double& y) const;
197
198void recopierVariablesSimples(const LocalMap<T>& lm);
199LocalMap<T>& Set(const LocalMap<T>& a);
200
201
202// ---------- Variables internes ----------------------------
203
204int_4 nSzX_;
205int_4 nSzY_;
206int_4 nPix_;
207bool originFlag_;
208bool extensFlag_;
209int_4 x0_;
210int_4 y0_;
211double theta0_;
212double phi0_;
213double angle_;
214double cos_angle_;
215double sin_angle_;
216double angleX_;
217double angleY_;
218double tgAngleX_;
219double tgAngleY_;
220NDataBlock<T> pixels_;
221};
222
223
224
225} // Fin du namespace
226
227#endif
Note: See TracBrowser for help on using the repository browser.