#include <cmath>
using namespace std;

#include "Options.h"
#include "libdisplay/libdisplay.h"

void
drawSunGlare(DisplayBase *display, const double X, const double Y, 
             const double R, const unsigned char *color)
{
    Options *options = Options::getInstance();
    const double glare = options->Glare() * R;
    const double falloff = options->Glare() / log(256.0);

    const int height = display->Height();
    const int width = display->Width();
    for (int j = 0; j < height; j++)
    {
        const double jdist = Y - j;      // decreases downward
        for (int i = 0; i < width; i++)
        {
            const double idist = i - X;  // increases to the right
            const double dist = sqrt(idist * idist + jdist * jdist);
            if (dist > R-3 && dist < glare)
            {
                // draw the glare
                const double angle = atan2(jdist, idist);
                const double brightness = (0.05 * (19 + cos(12 * angle)) 
                                           * exp((1-dist/R)/falloff));
                
                display->setPixel(i, j, color, brightness);
            }
        }
    }
}


syntax highlighted by Code2HTML, v. 0.9.1