fehler im diamond Square Alg..
-
hallo,
hab mir mal eine diamond Square alg geschreiben. Leider gibt wenn ich das als mesh darstelle "außreißer" wo es eigentlich keine geben könnte. Kann man jemand nach schaun ob er einen fehler im source findet. Hab schon ne halbe ewigkeit gesucht..
(anm: source noch nich kommentiert und ein wenig durcheinander)
link zu den ausreißern (bild)
www.xroads42.de/aus.png
edit: ist nur am rand so. mittendrin nur manchmal..Cdiamondsquare.h:
class CDiamondSquare { private: // Private attributes int **data; unsigned int size; int iteration_nr; int roughness; int acc_roughness; public: CDiamondSquare(); virtual ~CDiamondSquare(); CDiamondSquare(unsigned int s,float h); int ** getData(); void newGen(); void calcMinMax(); private: // Private methods int my_rand(void); void calc_new_roughness(); void DiamondStep(void); int DiamondCalc(unsigned int x,unsigned int y, unsigned int d); int SquareCalc( int x, int y, int distance); void SquareStep(void); public: // Public attributes int min; int max; };
/** No descriptions */ CDiamondSquare::CDiamondSquare(unsigned int s,float h) { size=s; roughness=h; data=new int*[size]; for(unsigned int i=0;i<size;++i) data[i]=new int[size]; newGen(); } int CDiamondSquare::my_rand(void) { if(acc_roughness<1) return 0; return rand()%(acc_roughness<<1)-acc_roughness; } void CDiamondSquare::calc_new_roughness() { acc_roughness=128.0f*pow(roughness,iteration_nr-1); } void CDiamondSquare::DiamondStep(void) { int neighbor_distance; int next_center_distance; next_center_distance=(size-1)>>(iteration_nr-1); neighbor_distance=(size-1)>>iteration_nr; for(unsigned int x=neighbor_distance;x<size;x+=next_center_distance) for(unsigned int y=neighbor_distance;y<size;y+=next_center_distance) { if(data[x][y]==-1) data[x][y]=DiamondCalc(x,y,neighbor_distance); } } /** No descriptions */ int CDiamondSquare::DiamondCalc(unsigned int x,unsigned int y,unsigned int d) { /* cout<<(( data[x-d][y-d] +data[x+d][y+d] +data[x-d][y+d] +data[x+d][x-d])/4 +my_rand())<<endl; */ if(x+d>size-1 ||y+d>size-1) cout<<"lala"<<endl; return ( data[x-d][y-d] +data[x+d][y+d] +data[x-d][y+d] +data[x+d][x-d])/4 +my_rand(); } /** No descriptions */ int CDiamondSquare::SquareCalc( int x, int y,int distance) { int tmp=0; int c=0; if(x>size-1 ||y>size-1) cout<<"lala"<<endl; if(x-distance>-1) { tmp+=data[x-distance][y]; ++c; } if(x+distance<size) { tmp+=data[x+distance][y]; ++c; } if(y+distance<size) { tmp+=data[x][y+distance]; ++c; } if(y-distance>-1) { tmp+=data[x][y-distance]; ++c; } tmp/=c; return tmp+my_rand(); } /** No descriptions */ void CDiamondSquare::SquareStep(void) { int neighbor_distance; int next_center_distance; next_center_distance=(size-1)>>(iteration_nr-1); neighbor_distance=(size-1)>>iteration_nr; for(unsigned int x=neighbor_distance;x<size;x+=next_center_distance) for(unsigned int y=neighbor_distance;y<size;y+=next_center_distance) { if(data[x-neighbor_distance][y]==-1); data[x-neighbor_distance][y]=SquareCalc(x-neighbor_distance,y,neighbor_distance); if(data[x+neighbor_distance][y]==-1); data[x+neighbor_distance][y]=SquareCalc(x+neighbor_distance,y,neighbor_distance); if(data[x][y+neighbor_distance]==-1) data[x][y+neighbor_distance]=SquareCalc(x,y+neighbor_distance,neighbor_distance); if(data[x][y-neighbor_distance]==-1) data[x][y-neighbor_distance]=SquareCalc(x,y-neighbor_distance,neighbor_distance); } } /** No descriptions */ int ** CDiamondSquare::getData() { return data; } /** No descriptions */ void CDiamondSquare::newGen() { acc_roughness=roughness; for(unsigned int x=0;x<size;++x) for(unsigned int y=0;y<size;++y) data[x][y]=-1; iteration_nr=1; calc_new_roughness(); data[0][0]=acc_roughness+my_rand(); data[0][size-1]=acc_roughness+my_rand(); data[size-1][0]=acc_roughness+my_rand(); data[size-1][size-1]=acc_roughness+my_rand(); while(size>>iteration_nr!=0) { DiamondStep(); SquareStep(); ++iteration_nr; calc_new_roughness(); } calcMinMax(); } /** No descriptions */ void CDiamondSquare::calcMinMax() { max=min=data[0][0]; for(int x=0;x<size;++x) for(int y=0;y<size;++y) { if(data[x][y]<min) min=data[x][y]; else if(data[x][y]>max) max=data[x][y]; } }
-
Dieses Problem kann der Poster IMHO selbst lösen. Unter Umständen ist dazu eines der folgenden Hilfsmittel zu nutzen:
- Dokumentation zur benutzen API
- google
- FAQ/Suche dieses Boards
- Debugger
- geringe Mengen GehirnschmalzDieses Posting wurde nicht automatisch generiert sondern per Hand eingefügt. Beschwerden werden trotzdem ignoriert.
Disclaimer: dies ist kein direkter persönlicher Angriff.
Bye, TGGC \-/
-
TGGC schrieb:
Dieses Problem kann der Poster IMHO selbst lösen. Unter Umständen ist dazu eines der folgenden Hilfsmittel zu nutzen:
- Dokumentation zur benutzen API
- google
- FAQ/Suche dieses Boards
- Debugger
- geringe Mengen GehirnschmalzDieses Posting wurde nicht automatisch generiert sondern per Hand eingefügt. Beschwerden werden trotzdem ignoriert.
Disclaimer: dies ist kein direkter persönlicher Angriff.
Bye, TGGC \-/
Fick dich!
dies ist ein direkter persönlicher Angriff.
-
hahaha nice
"wieso postest du wenn du nix zusagen hat?" lese ich dauernd, aber sowas ist erlaubt?