Сообщение от pozitiffcat
а это вообще зачем? ландшафт генерить?
|
В принципе для любой природной хрени нужен минимально обработанный шум, потому как с обычным rand() получается плохой результат. Даймонд сквэйр дает все-таки результат больше похожий на пожамканную газету, зато резкий

причем мою его реализацию можно еще ускорить раз в ацать там где-то затесались лишние проходы

Нагавнокодил таки простейший шум перлина с простым растеризатором.
Говнокод это когда знаешь как сделать быстрей, но сделаешь так только за деньги?
!!текстура 2^size x 2^size не надо туда ставить больших значений!!

//***********************************
int ARGB (int a,int r,int b, int g){
int color=(a<<24)+(r<<16)+(b<<8)+g;
return color;
}
//***********************************
Handle perlin_noise(int seed, int size){
srand(seed);
int resolution=1<<size;
printf("\n resolution %d",resolution);
//создание структуры данных
double **m[size];
for(int i=0;i<size;i++){
int width=1<<(i+1);
m[i]=new double*[width];
for(int j=0;j<width;j++){m[i][j]=new double[width];}
printf("\n %d",width);
}
//заполнение структуры шумом
for(int i=0;i<size;i++){
int width=1<<(i+1);
for(int j=0;j<width;j++){for(int k=0;k<width;k++){
//double kof=(size-i);
/*
if(i==0){kof=4.01;}
if(i==1){kof=2.51;}
if(i==2){kof=1.51;}
if(i==3){kof=2.01;}
if(i==4){kof=1.41;}
if(i==5){kof=0.51;}*/
m[i][j][k]=(1-2*(double)rand()/RAND_MAX);}}}
//теперь семь одинаковых массивов максимального размера
double **m1[size];
for(int i=0;i<size;i++){
int width=resolution;
m1[i]=new double*[width];
for(int j=0;j<width;j++){m1[i][j]=new double[width];}
}
//обнуление
for(int i=0;i<size;i++){
for(int j=0;j<resolution;j++){for(int k=0;k<resolution;k++){m1[i][j][k]=0;}}}
//*****************************************************
//надо прописать весь шум в блок растеризации
for(int i=0;i<size;i++){
int width=1<<(i+1);
for(int j=0;j<width;j++){for(int k=0;k<width;k++){
m1[i][j<<(size-i-1)][k<<(size-i-1)]=m[i][j][k];}}}
//*****************************************************
for(int k=0;k<size;k++){
int step=resolution>>1;
while(step>0){
for(int i=step;i<resolution-step;i=i+2*step){
for(int j=step;j<resolution-step;j=j+2*step){
double val00=m1[k][i-step][j-step];
double val01=m1[k][i-step][j+step];
double val10=m1[k][i+step][j-step];
double val11=m1[k][i+step][j+step];
if(m1[k][i][j]==0 && val00!=0 && val01!=0 && val10!=0 && val11!=0){m1[k][i][j]=0.25*(val00+val01+val10+val11);}
if(m1[k][i-step][j]==0 && val00!=0 && val01!=0){m1[k][i-step][j]=0.5*(val00+val01);}
if(m1[k][i+step][j]==0 && val10!=0 && val11!=0){m1[k][i+step][j]=0.5*(val10+val11);}
if(m1[k][i][j-step]==0 && val00!=0 && val10!=0){m1[k][i][j-step]=0.5*(val00+val10);}
if(m1[k][i][j+step]==0 && val01!=0 && val11!=0){m1[k][i][j+step]=0.5*(val01+val11);}
}
}
step=step>>1;}
}
//*****************************************************
//создание массива для суммы значений
double **m0=new double*[resolution];
for(int j=0;j<resolution;j++){m0[j]=new double[resolution];}
//суммирование
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;j++){
double val=0;
for(int k=0;k<size;k++){val=val+m1[k][i][j];}
m0[i][j]=val;
}}
//приведение в интервал (0,1)
double min=100000.01;
double max=-100000.01;
for(int i=0;i<resolution;i++){for(int j=0;j<resolution;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<resolution;i++){for(int j=0;j<resolution;j++){
m0[i][j]=(m0[i][j]-min)/length;
}}
//рисование текстуры
Handle tex=xCreateTexture(resolution,resolution);
xSetBuffer(xTextureBuffer(tex));
xLockBuffer(xTextureBuffer(tex));
for (int i=0;i<resolution;i++){
for (int j=0;j<resolution;j++){
double val=pow(m0[i][j],2);
xWritePixelFast(i,j,ARGB(255,255*val,255*val,255*val),xTextureBuffer(tex));/*
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),xTextureBuffer(tex));*/
}}
xSetBuffer(xBackBuffer());
xUnlockBuffer(xTextureBuffer(tex));
return tex;
}
А че принтф это оооочень тормазная ф-ция?