#include //For assert #include //For std::sqrt #include //For std::min //From http://www.richelbilderbeek.nl/CppDrawGlobe.htm void DrawGlobe( TImage * const image, const unsigned char rMax, const unsigned char gMax, const unsigned char bMax) { assert(image!=0); const int width = image->Picture->Bitmap->Width; const int height = image->Picture->Bitmap->Height; const double midX = static_cast(width ) / 2.0; const double midY = static_cast(height) / 2.0; const double maxDist = std::min(midX,midY); for (int y=0; y!=height; ++y) { unsigned char * const line = static_cast(image->Picture->Bitmap->ScanLine[y]); const double yD = static_cast(y); for (int x=0; x!=width; ++x) { const double xD = static_cast(x); const double dist = std::sqrt( ((xD - midX) * (xD - midX)) + ((yD - midY) * (yD - midY)) ); if (dist <= maxDist) { const double relDist = dist / maxDist; const int r = relDist * static_cast(rMax); const int g = relDist * static_cast(gMax); const int b = relDist * static_cast(bMax); assert( r >= 0); assert( r < 256); assert( g >= 0); assert( g < 256); assert( b >= 0); assert( b < 256); line[x*3+2] = (r == 0 ? 1 : r); //Never use a zero for red line[x*3+1] = (g == 0 ? 1 : g); //Never use a zero for green line[x*3+0] = (b == 0 ? 1 : b); //Never use a zero for blue } else { line[x*3+2] = 0; line[x*3+1] = 0; line[x*3+0] = 0; } } } }