Тема: Странное.
Показать сообщение отдельно
Старый 10.09.2011, 23:02   #40
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

генератор карт высот по алгоритму diamond square

починил глюк, это был мусор в памяти
void xSeedRnd(int seed){
    
srand(seed);
}

double xRnd(double mindouble max){
    
double length=max-min;
    
double var =((double) rand() / (double)RAND_MAX);
    
double value=min+var*length;
return 
value;
}

int ARGB (int a,int r,int bint g){
int color=(a<<24)+(r<<16)+(b<<8)+g;
return 
color;
}

Handle Map_Generator(int sizedouble sharp){
xSeedRnd(xMillisecs());
//создается массив для значений

double *m0[size+1];
for(
int i=0;i<=size;i++){
    
m0[i]= new double[size];
}
for(
int i=0;i<=size;i++){
    for(
int j=0;j<=size;j++){
        
m0[i][j]=0;
        }
    }
//заполнение краев случайными числами (1;5)
m0[0][0]=xRnd(-5,5);
m0[size][0]=xRnd(-5,5);
m0[0][size]=xRnd(-5,5);
m0[size][size]=xRnd(-5,5);
//определяю степень size
int m=size;
int repetitions=0;
while(
m!=1){
repetitions++;
m=size>>repetitions;
}
repetitions--;

int step=size>>1;
while(
step>0){
    
//первая строка
    
for(int i=step;i<=size-step;i=i+step){
        for(
int j=step;j<=size-step;j=j+step){
         
//углы текущей ячейки
        
double val00=m0[i-step][j-step];
        
double val01=m0[i-step][j+step];
        
double val10=m0[i+step][j-step];
        
double val11=m0[i+step][j+step];
         
//крест генерируемых значений
        
if(m0[i][j]==&& val00!=&& val01!=&& val10!=&& val11!=0){m0[i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
        if(
m0[i-step][j]==&& val00!=&& val01!=0){m0[i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i+step][j]==&& val10!=&& val11!=0){m0[i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i][j-step]==&& val00!=&& val10!=0){m0[i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
        if(
m0[i][j+step]==&& val01!=&& val11!=0){m0[i][j+step]=0.5*(val01+val11)+0.5*step*xRnd(-sharp,sharp);}
        }
    }
step=step>>1;
}
//приведение значений в массиве в интервал (0;1)
double max=0;
double min=0;
for (
int i=0;i<=size;i++){
    for (
int j=0;j<=size;j++){
        if(
m0[i][j]>=max){max=m0 [i][j];}
        if(
m0[i][j]<=min){min=m0 [i][j];}
    }
}

double length=max-min;
for (
int i=0;i<=size;i++){
    for (
int j=0;j<=size;j++){
        
m0[i][j]=(m0 [i][j]-min)/length;
    }
}
//*************************************
//дальше вывод значений
Handle tex=xCreateTexture(size,size);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (
int i=0;i<size;i++){
    for (
int j=0;j<size;j++){
        
int color=255*m0 [i][j];
        
xWritePixelFast(i,j,ARGB(255,color,color,color),xTextureBuffer(tex));
    }
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return 
tex;

на пробел сгенерировать новую карту.

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием