X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fbucket%2Fnewbucket.hxx;h=09169f860fd0435d8d8a60a5a185ac7842e4edfb;hb=f205e918d9e1df28da3df69c6c58df6b6391916f;hp=ccb5a8f9f48330590d469ac40b35a560685f502f;hpb=e700fc6f34f151a5f3f5c51ffca164d5199c7fa5;p=simgear.git diff --git a/simgear/bucket/newbucket.hxx b/simgear/bucket/newbucket.hxx index ccb5a8f9..09169f86 100644 --- a/simgear/bucket/newbucket.hxx +++ b/simgear/bucket/newbucket.hxx @@ -24,6 +24,11 @@ /** \file newbucket.hxx * A class and associated utiltity functions to manage world scenery tiling. + * + * Tile borders are aligned along circles of latitude and longitude. + * All tiles are 1/8 degree of latitude high and their width in degrees + * longitude depends on their latitude, adjusted in such a way that + * all tiles cover about the same amount of area of the earth surface. */ #ifndef _NEWBUCKET_HXX @@ -33,29 +38,11 @@ #include #include -#ifdef SG_HAVE_STD_INCLUDES -# include -# include // sprintf() -#else -# include -# include // sprintf() -#endif - -#include STL_IOSTREAM - -// I don't understand ... or should be included -// already depending on how you defined SG_HAVE_STD_INCLUDES, but I -// can go ahead and add this -- CLO -#ifdef __MWERKS__ -SG_USING_STD(sprintf); -SG_USING_STD(fabs); -#endif - -#include STL_STRING - -SG_USING_STD(string); -SG_USING_STD(ostream); - +#include +#include // sprintf() +#include +#include +#include /** * standard size of a bucket in degrees (1/8 of a degree) @@ -71,9 +58,7 @@ SG_USING_STD(ostream); // return the horizontal tile span factor based on latitude static double sg_bucket_span( double l ) { if ( l >= 89.0 ) { - return 360.0; - } else if ( l >= 88.0 ) { - return 8.0; + return 12.0; } else if ( l >= 86.0 ) { return 4.0; } else if ( l >= 83.0 ) { @@ -94,12 +79,10 @@ static double sg_bucket_span( double l ) { return 1.0; } else if ( l >= -86.0 ) { return 2.0; - } else if ( l >= -88.0 ) { - return 4.0; } else if ( l >= -89.0 ) { - return 8.0; + return 4.0; } else { - return 360.0; + return 12.0; } } @@ -114,7 +97,6 @@ static double sg_bucket_span( double l ) { class SGBucket { private: - double cx, cy; // centerpoint (lon, lat) in degrees of bucket short lon; // longitude index (-180 to 179) short lat; // latitude index (-90 to 89) char x; // x subdivision (0 to 7) @@ -210,18 +192,19 @@ public: * string form. * @return tile index in string form */ - inline string gen_index_str() const { + inline std::string gen_index_str() const { char tmp[20]; - sprintf(tmp, "%ld", - (((long)lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x); - return (string)tmp; + std::sprintf(tmp, "%ld", + (((long)lon + 180) << 14) + ((lat + 90) << 6) + + (y << 3) + x); + return (std::string)tmp; } /** * Build the base path name for this bucket. * @return base path in string form */ - string gen_base_path() const; + std::string gen_base_path() const; /** * @return the center lon of a tile. @@ -230,9 +213,9 @@ public: double span = sg_bucket_span( lat + y / 8.0 + SG_HALF_BUCKET_SPAN ); if ( span >= 1.0 ) { - return lon + span / 2.0; + return lon + get_width() / 2.0; } else { - return lon + x * span + span / 2.0; + return lon + x * span + get_width() / 2.0; } } @@ -306,10 +289,15 @@ public: // friends - friend ostream& operator<< ( ostream&, const SGBucket& ); + friend std::ostream& operator<< ( std::ostream&, const SGBucket& ); friend bool operator== ( const SGBucket&, const SGBucket& ); }; +inline bool operator!= (const SGBucket& lhs, const SGBucket& rhs) + { + return !(lhs == rhs); + } + /** * \relates SGBucket @@ -335,15 +323,24 @@ SGBucket sgBucketOffset( double dlon, double dlat, int x, int y ); void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy ); +/** + * \relates SGBucket + * retrieve a list of buckets in the given bounding box + * @param min min lon,lat of bounding box in degrees + * @param max max lon,lat of bounding box in degrees + * @param list standard vector of buckets within the bounding box + */ +void sgGetBuckets( const SGGeod& min, const SGGeod& max, std::vector& list ); + /** * Write the bucket lon, lat, x, and y to the output stream. * @param out output stream * @param b bucket */ -inline ostream& -operator<< ( ostream& out, const SGBucket& b ) +inline std::ostream& +operator<< ( std::ostream& out, const SGBucket& b ) { - return out << b.lon << ":" << b.x << ", " << b.lat << ":" << b.y; + return out << b.lon << ":" << (int)b.x << ", " << b.lat << ":" << (int)b.y; }