00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00063 while( p != 0 )
00064 {
00065 uint p2 = 2 * p;
00066
00067
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
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 }