int main() { int a, b, c; int numerator, denominator; numerator = 1; denominator = 1; for (a=1; a<=9; a++) { for (b=1; b<=9; b++) { for (c=1; c<=9; c++) { if (a*(10*b+c) == c*(10*a+b) && a < c) { printf("%d/%d is %d/%d\n", 10*a+b, 10*b+c, a, c); numerator *= a; denominator *= c; } } } } printf("%d/%d is %d\n", numerator, denominator, maxDivisor(numerator, denominator)); printf("denominator is %d\n", denominator/maxDivisor(numerator, denominator)); return 0; }
void SunLightBlending::blend( QImage * const tileImage, Tile const * const top ) const { if ( tileImage->depth() != 32 ) return; // TODO add support for 8-bit maps? // add sun shading const TileId id = top->id(); const qreal global_width = tileImage->width() * TileLoaderHelper::levelToColumn( m_levelZeroColumns, id.zoomLevel() ); const qreal global_height = tileImage->height() * TileLoaderHelper::levelToRow( m_levelZeroRows, id.zoomLevel() ); const qreal lon_scale = 2*M_PI / global_width; const qreal lat_scale = -M_PI / global_height; const int tileHeight = tileImage->height(); const int tileWidth = tileImage->width(); // First we determine the supporting point interval for the interpolation. const int n = maxDivisor( 30, tileWidth ); const int ipRight = n * (int)( tileWidth / n ); const QImage *nighttile = top->image(); for ( int cur_y = 0; cur_y < tileHeight; ++cur_y ) { const qreal lat = lat_scale * ( id.y() * tileHeight + cur_y ) - 0.5*M_PI; const qreal a = sin( ( lat+DEG2RAD * m_sunLocator->getLat() )/2.0 ); const qreal c = cos(lat)*cos( -DEG2RAD * m_sunLocator->getLat() ); QRgb* scanline = (QRgb*)tileImage->scanLine( cur_y ); const QRgb* nscanline = (QRgb*)nighttile->scanLine( cur_y ); qreal lastShade = -10.0; int cur_x = 0; while ( cur_x < tileWidth ) { const bool interpolate = ( cur_x != 0 && cur_x < ipRight && cur_x + n < tileWidth ); qreal shade = 0; if ( interpolate ) { const int check = cur_x + n; const qreal checklon = lon_scale * ( id.x() * tileWidth + check ); shade = m_sunLocator->shading( checklon, a, c ); // if the shading didn't change across the interpolation // interval move on and don't change anything. if ( shade == lastShade && shade == 1.0 ) { scanline += n; nscanline += n; cur_x += n; continue; } if ( shade == lastShade && shade == 0.0 ) { for ( int t = 0; t < n; ++t ) { m_sunLocator->shadePixelComposite( *scanline, *nscanline, shade ); ++scanline; ++nscanline; } cur_x += n; continue; } for ( int t = 0; t < n ; ++t ) { qreal lon = lon_scale * ( id.x() * tileWidth + cur_x ); shade = m_sunLocator->shading( lon, a, c ); m_sunLocator->shadePixelComposite( *scanline, *nscanline, shade ); ++scanline; ++nscanline; ++cur_x; } } else { // Make sure we don't exceed the image memory if ( cur_x < tileWidth ) { qreal lon = lon_scale * ( id.x() * tileWidth + cur_x ); shade = m_sunLocator->shading( lon, a, c ); m_sunLocator->shadePixelComposite( *scanline, *nscanline, shade ); ++scanline; ++nscanline; ++cur_x; } } lastShade = shade; } } }