00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00029 #ifndef _NEWBUCKET_HXX
00030 #define _NEWBUCKET_HXX
00031
00032 #include <simgear/compiler.h>
00033 #include <simgear/constants.h>
00034 #include <simgear/math/SGMath.hxx>
00035
00036 #include <cmath>
00037 #include <cstdio>
00038 #include <ostream>
00039 #include <string>
00040
00044 #define SG_BUCKET_SPAN 0.125
00045
00049 #define SG_HALF_BUCKET_SPAN ( 0.5 * SG_BUCKET_SPAN )
00050
00051
00052
00053 static double sg_bucket_span( double l ) {
00054 if ( l >= 89.0 ) {
00055 return 360.0;
00056 } else if ( l >= 88.0 ) {
00057 return 8.0;
00058 } else if ( l >= 86.0 ) {
00059 return 4.0;
00060 } else if ( l >= 83.0 ) {
00061 return 2.0;
00062 } else if ( l >= 76.0 ) {
00063 return 1.0;
00064 } else if ( l >= 62.0 ) {
00065 return 0.5;
00066 } else if ( l >= 22.0 ) {
00067 return 0.25;
00068 } else if ( l >= -22.0 ) {
00069 return 0.125;
00070 } else if ( l >= -62.0 ) {
00071 return 0.25;
00072 } else if ( l >= -76.0 ) {
00073 return 0.5;
00074 } else if ( l >= -83.0 ) {
00075 return 1.0;
00076 } else if ( l >= -86.0 ) {
00077 return 2.0;
00078 } else if ( l >= -88.0 ) {
00079 return 4.0;
00080 } else if ( l >= -89.0 ) {
00081 return 8.0;
00082 } else {
00083 return 360.0;
00084 }
00085 }
00086
00087
00095 class SGBucket {
00096
00097 private:
00098 double cx, cy;
00099 short lon;
00100 short lat;
00101 char x;
00102 char y;
00103
00104 public:
00105
00109 SGBucket();
00110
00116 SGBucket(const double dlon, const double dlat);
00117
00123 SGBucket(const SGGeod& geod);
00124
00131 SGBucket(const bool is_good);
00132
00136 SGBucket(const long int bindex);
00137
00143 void set_bucket( double dlon, double dlat );
00144
00150 void set_bucket( double *lonlat );
00151
00157 void set_bucket(const SGGeod& geod);
00158
00165 inline void make_bad() {
00166 set_bucket(0.0, 0.0);
00167 lon = -1000;
00168 }
00169
00185 inline long int gen_index() const {
00186 return ((lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x;
00187 }
00188
00194 inline std::string gen_index_str() const {
00195 char tmp[20];
00196 std::sprintf(tmp, "%ld",
00197 (((long)lon + 180) << 14) + ((lat + 90) << 6)
00198 + (y << 3) + x);
00199 return (std::string)tmp;
00200 }
00201
00206 std::string gen_base_path() const;
00207
00211 inline double get_center_lon() const {
00212 double span = sg_bucket_span( lat + y / 8.0 + SG_HALF_BUCKET_SPAN );
00213
00214 if ( span >= 1.0 ) {
00215 return lon + span / 2.0;
00216 } else {
00217 return lon + x * span + span / 2.0;
00218 }
00219 }
00220
00224 inline double get_center_lat() const {
00225 return lat + y / 8.0 + SG_HALF_BUCKET_SPAN;
00226 }
00227
00231 double get_width() const;
00232
00236 double get_height() const;
00237
00241 double get_width_m() const;
00242
00246 double get_height_m() const;
00247
00251 SGGeod get_center() const
00252 { return SGGeod::fromDeg(get_center_lon(), get_center_lat()); }
00253
00257 SGGeod get_corner(unsigned num) const
00258 {
00259 double lonFac = ((num + 1) & 2) ? 0.5 : -0.5;
00260 double latFac = ((num ) & 2) ? 0.5 : -0.5;
00261 return SGGeod::fromDeg(get_center_lon() + lonFac*get_width(),
00262 get_center_lat() + latFac*get_height());
00263 }
00264
00265
00266
00271 inline int get_chunk_lon() const { return lon; }
00272
00277 inline int get_chunk_lat() const { return lat; }
00278
00282 inline int get_x() const { return x; }
00283
00287 inline int get_y() const { return y; }
00288
00289
00290
00291 friend std::ostream& operator<< ( std::ostream&, const SGBucket& );
00292 friend bool operator== ( const SGBucket&, const SGBucket& );
00293 };
00294
00295 inline bool operator!= (const SGBucket& lhs, const SGBucket& rhs)
00296 {
00297 return !(lhs == rhs);
00298 }
00299
00300
00311 SGBucket sgBucketOffset( double dlon, double dlat, int x, int y );
00312
00313
00322 void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy );
00323
00324
00330 inline std::ostream&
00331 operator<< ( std::ostream& out, const SGBucket& b )
00332 {
00333 return out << b.lon << ":" << b.x << ", " << b.lat << ":" << b.y;
00334 }
00335
00336
00343 inline bool
00344 operator== ( const SGBucket& b1, const SGBucket& b2 )
00345 {
00346 return ( b1.lon == b2.lon &&
00347 b1.lat == b2.lat &&
00348 b1.x == b2.x &&
00349 b1.y == b2.y );
00350 }
00351
00352
00353 #endif // _NEWBUCKET_HXX
00354
00355