Go back to Richel Bilderbeek's homepage.
Go back to Richel Bilderbeek's C++ page.
Graphics code
snippet to draw
a globe
* View an example image of a globe created by DrawGlobe.
* View the code of 'DrawGlobe' for VCL in plain text.
Under
construction.
#include <cassert> //For assert
#include <cmath> //For std::sqrt
#include <algorithm> //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<double>(width
) / 2.0;
const double midY = static_cast<double>(height)
/ 2.0;
const double maxDist = std::min(midX,midY);
for (int y=0; y!=height; ++y)
{
unsigned char * const line
= static_cast<unsigned char
*>(image->Picture->Bitmap->ScanLine[y]);
const double yD = static_cast<double>(y);
for (int x=0; x!=width; ++x)
{
const double xD = static_cast<double>(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<double>(rMax);
const int g = relDist * static_cast<double>(gMax);
const int b = relDist * static_cast<double>(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;
}
}
}
}
Go back to Richel Bilderbeek's C++ page.
Go back to Richel Bilderbeek's homepage.