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



Выкинул лишние проходы и научил это раскрашивать текстуру Теперь оно еще в 4 раза быстрей

void xSeedRnd(int seed){
srand(seed);
}

double xRnd(double min, double 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 b, int g){
int color=(a<<24)+(r<<16)+(b<<+g;
return color;
}


Handle Map_Generator(int size, double sharp, int diff){

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);

int step=size>>1;
while(step>0){
//первая строка
for(int i=step;i<=size-step;i=i+2*step){
for(int j=step;j<=size-step;j=j+2*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]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){m0[i][j]=0.25*(val00+val01+val10+val11)+step*xRnd(-sharp,sharp);}
if(m0[i-step][j]==0 && val00!=0 && val01!=0){m0[i-step][j]=0.5*(val00+val01)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i+step][j]==0 && val10!=0 && val11!=0){m0[i+step][j]=0.5*(val10+val11)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i][j-step]==0 && val00!=0 && val10!=0){m0[i][j-step]=0.5*(val00+val10)+0.5*step*xRnd(-sharp,sharp);}
if(m0[i][j+step]==0 && val01!=0 && 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]=pow(((m0 [i][j]-min)/length),diff);
}
}
//*************************************
//дальше вывод значений
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++){
double val=pow(m0 [i][j],2);
//уровень воды пусть будет 0,25. ТО есть чем ниже тем более синий цвет.
int red=0;
int green=0;
int blue=0;
if(val<=0.25) {blue=(1-val)*255; green=125*(1-val);red=0;} else {
if(val>=0.6) {red=255*val; green=120*val;blue=0;}
else{red=255*val; green=255*val;blue=0;}

}
xWritePixelFast(i,j,ARGB(255,red,green,blue),xText ureBuffer(tex));
}
}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));

return tex;
}

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
moka (11.09.2011), Mr_F_ (11.09.2011), Nex (11.09.2011), St_AnGer (11.09.2011)