Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

diamon.cpp

00001 /***************************************************************************
00002                         diamon.cpp  -  description
00003                             -------------------
00004     begin                : july 2nd, 2006
00005     copyright            : (C) 2006 by Frédéric RODRIGO
00006     email                : f.rodrigo free.fr
00007     
00008     $Id: diamon.cpp 83 2006-11-05 20:46:42Z neoneurone $
00009  ***************************************************************************/
00010 
00011 /***************************************************************************
00012  *                                                                         *
00013  *   This program is free software; you can redistribute it and/or modify  *
00014  *   it under the terms of the GNU General Public License as published by  *
00015  *   the Free Software Foundation; either version 2 of the License, or     *
00016  *   any later version.                                                    *
00017  *                                                                         *
00018  ***************************************************************************/
00019 
00020 #include "diamon.h"
00021 
00022 #include <stdlib.h>
00023 #include <math.h>
00024 
00025 namespace MapGen
00026 {
00027 
00028    /*=====================================================================*/
00029 Diamon::Diamon( uint order ):
00030 _side((uint)pow(2,order))
00031 {
00032 }
00033 
00034 
00035    /*=====================================================================*/
00036 Map* Diamon::render() const
00037 {
00038     Map* map = new Map( _side, _side );
00039     map->setAt( 0,0, 128 );
00040     _sub( map, 0, 0, _side-1, _side-1 );
00041     return map;
00042 }
00043 
00044 
00045    /*=====================================================================*/
00046 float Diamon::_all( const uint p ) const
00047 {
00048     return ((float)rand())/RAND_MAX * p * 2 - p;
00049 }
00050 
00051 
00052    /*=====================================================================*/
00053 void Diamon::_sub(
00054     Map* map,
00055     const uint x1,
00056     const uint y1,
00057     const uint x2,
00058     const uint y2 ) const
00059 {
00060     uint p = map->getW() / 2;
00061 
00062     /* loop en scale */
00063     while( p != 0 )
00064     {
00065         uint p2 = 2 * p;
00066 
00067         //Diamond
00068         for( uint i=p ; i<map->getW() ; i+=p2 )
00069             for( uint j=p ; j<map->getH() ; j+=p2 )
00070                 map->setAt( i, j, ( map->getAt(i-p,j-p) + map->getAt(i+p,j-p) + map->getAt(i+p,j+p) + map->getAt(i-p,j+p) )/4 + _all(p) );
00071 
00072         // Square
00073         for( uint i=p ; i<map->getW() ; i+=p2 )
00074             for( uint j=0 ; j<map->getH() ; j+=p2 )
00075             map->setAt( i, j, ( map->getAt(i-p,j) + map->getAt(i+p,j) + map->getAt(i,j-p) + map->getAt(i,j+p) )/4 + _all(p) );
00076         for( uint i=0 ; i<map->getW() ; i+=p2 )
00077             for( uint j=p ; j<map->getH() ; j+=p2 )
00078                 map->setAt( i, j, ( map->getAt(i-p,j) + map->getAt(i+p,j) + map->getAt(i,j-p) + map->getAt(i,j+p) )/4 + _all(p) );
00079 
00080         p /= 2;
00081     }
00082 }
00083 
00084 }

Generated on Sat Nov 11 10:21:09 2006 for OpenCity by  doxygen 1.4.2