forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

SBJoker 09.09.2011 10:56

Ответ: Странное.
 
А оно невсегда упадёт, пока чужую память не попортишь.

dsd 09.09.2011 12:40

Ответ: Странное.
 
Цитата:

Сообщение от SBJoker (Сообщение 201760)
А оно невсегда упадёт, пока чужую память не попортишь.

это значит, что подобный указатель вернет мне адрес не той памяти, что была выделена под массив указатель на который я храню в ячейке исходного одномерного массива? Или что следить надо за тем, чтобы индексы были в пределах выделенной памяти?

Mr_F_ 09.09.2011 12:49

Ответ: Странное.
 
падать вроде и не должно. всем элементам массива указателей назначается адрес начала массива с даблами. соотв первый [2047] возьмёт указатель, второй сам дабл. правда смысла в массиве указателй на один и тот же адрес я не вижу.

Цитата:

при наличии этой строки падает
double gh[512][512];
делай так
double* gh = new double[512*512];

dsd 09.09.2011 12:59

Ответ: Странное.
 
А, понял на что мне гуру намекают :-) Что у меня во всех ячейках один и тот же массив и это попахивает кретинизмом хранить в одном массиве пару тысяч ссылок на один и тот же массив. Видимо для каждой ячейки нужно создавать уникальный массив и тогда все будет ок.

.Squid 09.09.2011 13:17

Ответ: Странное.
 
Да. Почитай про указатели еще раз.
ЗЫ. Ссылка != указатель, кстати.

dsd 10.09.2011 20:49

Ответ: Странное.
 
Продолжу нуб шоу по массивам:
double* gh = new double[512*512];
for(int i=0;i<512;i++) {
gh[0*i]=0.5*i;
}
for(int i=0;i<512;i++) {
printf(" value= %f",gh[0*i]);
}
печатает одно значение для всей строки, последнее. Я ожидал подряд идущих значений от 0 до 255,5.
упд. В нуле штолеО_о, это таки одномерный массив.

Идиотская конструкция печатает мне то что я хочу, где косяк в первой? ибо вторую печатать гораздо дольше:
//создаю массив
double *m0[size];
for(int i=0;i<size;i++){
m0[i]= new double[size];
}
//заполняю первую строку
for(int i=0;i<size;i++){
m0[0][i]=i;
}
//печатаю первую строку.
for(int i=0;i<size;i++){
printf(" index %f",m0[0][i]);
}

SBJoker 10.09.2011 21:58

Ответ: Странное.
 
0*i при любом значении i даёт 0, другими словами ты записываешь и печатаешь всегда значение одной единственной ячейки.

dsd 10.09.2011 22:19

Ответ: Странное.
 
Я понял уже смысл такой записи массива :)

Написал глючный квадроалмазный генератор выдающий текстуру :)

Причем он получился раз в 50 резче блитцевского при равном объеме вычислений. Генерирует текстуру 4096х4096 за 5 сек вместе с рисованием её против нескольких минут. Не зря я все-таки полировал себе мозг цпэпом.

Dream 10.09.2011 22:50

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 201915)
глючный квадроалмазный генератор

Простите, ЧТО?!

dsd 10.09.2011 23:02

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

починил глюк, это был мусор в памяти :)
PHP код:

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;


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

.Squid 11.09.2011 01:23

Ответ: Странное.
 
Как вариант, можно еще писать array[i + n*j], где n - число столбцов. Просто в действительности данные расположены линейно, никаких двумерных (и тем более трех- и n-мерных) структур данных в памяти не может быть.
ЗЫ. Не писал бы этого, если бы не увидел [0*i] о_О

dsd 11.09.2011 14:41

Ответ: Странное.
 


Выкинул лишние проходы и научил это раскрашивать текстуру :) Теперь оно еще в 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<<8)+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;
}

moka 11.09.2011 17:11

Ответ: Странное.
 
А шейдером можешь генерить подобное?

dsd 11.09.2011 19:19

Ответ: Странное.
 
Нет.

dsd 14.09.2011 20:03

Ответ: Странное.
 
У меня появилась идея скрестить спаренный генератор высот и мою недосистему частиц в ландшафт напоминающий таковой из майнкрафта, только другим макаром.

Для начала генерируется карта 4к х 4к, потом на основе девяти ячеек из карты генерится другая 128х128, с актуальным размером 112х112 и 16 кратным нахлестом с соседними тайлами, для избежания резких швов.
Вокруг игрока летает девять детализированных систем частиц и еще одна с шагом основной карты для изображения отдаленного пейзажа.

в одной системе частиц у меня получается уместить 20к квадов, 112х112=12544 верхушек кубиков и остается ~10к квадов для имитации стен вырытых канавок. Вроде достаточно. Всего уже получится 20х10=200 к полигонов на ландшафт. Потом для этого дела генерится мой любимый двумерный массив указателей в ячейках которого будут объекты несущие в своих полях маски для раскраски территории.

Ваши ставки, господа. Смогу ли я подобное сочинить? По ощущениям это должно быть впритык, но по силам :)


Часовой пояс GMT +4, время: 06:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot