Anonymous
Гость
|
|
« Ответ #12 : 07-04-2004 09:56 » |
|
Исходник. Смотрите, разбирайтесь, оценивайте... Сорри, что без коментариев, но писал "на скорую руку", только для проверки алгоритма, так что если чего-то не поймете - спрашивайте... #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <graphics.h>
#define SIZEX 128 #define SIZEY 128 #define ZERO -128
char Buf[256];
char HMap[SIZEX][SIZEY]={0};
int XOff=320, YOff=240;
float WaterLevel=0;
float kX=8; float kY=8; float kZ=1;
float CamX=100; float CamY=100; float CamZ=50;
float XX, XY, YX, YY, YZ;
struct TPoint { int X,Y; };
void InitMap(); void InitCam(); void Soft(); void AddWater(int); void AddHill(int, int, int, int); void AddHole(int, int, int, int); void AddNoize(int); void InitGraph(); void Draw(); void Done(); void Project(float, float, float, int &, int &);
void main() {randomize(); InitMap(); InitCam(); InitGraph(); Draw(); while(!kbhit()); while(kbhit())getch(); Done(); }
void Soft() {int i,j; float p=0; printf("Process: 0%"); for(i=1;i<SIZEX-1;i++) for(j=1;j<SIZEY-1;j++) {HMap[i][j]=(HMap[i][j]+ HMap[i+1][j]+ HMap[i][j+1]+ HMap[i+1][j+1]+ HMap[i-1][j]+ HMap[i][j-1]+ HMap[i-1][j-1]+ HMap[i-1][j+1]+ HMap[i+1][j-1])/9; printf("%c%c%c%c%3d%",8,8,8,8,(int)p); p+=(float)100/(SIZEX-2)/(SIZEY-2); } for(i=1;i<SIZEX-1;i++) {HMap[i][0]=(HMap[i][0]+ HMap[i+1][0]+ HMap[i-1][0]+ HMap[i+1][1]+ HMap[i][1]+ HMap[i-1][1])/6; HMap[i][SIZEY-1]=(HMap[i][SIZEY-1]+ HMap[i+1][SIZEY-1]+ HMap[i-1][SIZEY-1]+ HMap[i+1][SIZEY-2]+ HMap[i][SIZEY-2]+ HMap[i-1][SIZEY-2])/6; } for(j=1;j<SIZEY-1;j++) {HMap[0][j]=(HMap[0][j-1]+ HMap[0][j]+ HMap[0][j+1]+ HMap[1][j-1]+ HMap[1][j]+ HMap[1][j+1])/6; HMap[SIZEX-1][j]=(HMap[SIZEX-1][j-1]+ HMap[SIZEX-1][j]+ HMap[SIZEX-1][j-1]+ HMap[SIZEX-2][j-1]+ HMap[SIZEX-2][j]+ HMap[SIZEX-2][j+1])/6; } HMap[0][0]=0.25*(HMap[0][0]+ HMap[1][0]+ HMap[0][1]+ HMap[1][1]); HMap[SIZEX-1][0]=0.25*(HMap[SIZEX-1][0]+ HMap[SIZEX-2][0]+ HMap[SIZEX-1][1]+ HMap[SIZEX-2][1]); HMap[0][SIZEY-1]=0.25*(HMap[0][SIZEY-1]+ HMap[1][SIZEY-1]+ HMap[0][SIZEY-2]+ HMap[1][SIZEY-2]); HMap[SIZEX-1][SIZEY-1]=0.25*(HMap[SIZEX-1][SIZEY-1]+ HMap[SIZEX-2][SIZEY-1]+ HMap[SIZEX-1][SIZEY-2]+ HMap[SIZEX-2][SIZEY-2]); }
void InitMap() {int i,j; AddWater(1); AddHill(SIZEX/2,SIZEY/2,SIZEX/2,127); AddHole(SIZEX/2+2,SIZEY/2-2,2,-100); AddNoize(50); for(i=0;i<4;i++) Soft(); }
void InitGraph() {int GD=VGA, GM=VGAHI; initgraph(&GD,&GM,""); }
void Draw() {TPoint Buf[4]; int SX=0; int SY=0; int FX=SIZEX-1; int FY=SIZEY-1; int dX,dY; int i,j,k; float X,Y,Z,Average; int OX=SIZEX/2, OY=SIZEY/2; setcolor(15); if(CamX>0&&CamY>0) {for(i=SX;i<FX;i++) for(j=SY;j<FY;j++) {X=(i-OX); Y=(j-OY); Average=(HMap[i][j]+ HMap[i+1][j]+ HMap[i][j+1]+ HMap[i+1][j]+1); if(HMap[i][j]<=0)Z=0; else Z=HMap[i][j]; Project(X*kX,Y*kY,Z*kZ,Buf[0].X,Buf[0].Y); if(HMap[i+1][j]<=0)Z=0; else Z=HMap[i+1][j]; Project((X+1)*kX,Y*kY,Z*kZ,Buf[1].X,Buf[1].Y); if(HMap[i+1][j+1]<=0)Z=0; else Z=HMap[i+1][j+1]; Project((X+1)*kX,(Y+1)*kY,Z*kZ,Buf[2].X,Buf[2].Y); if(HMap[i][j+1]<=0)Z=0; else Z=HMap[i][j+1]; Project(X*kX,(Y+1)*kY,Z*kZ,Buf[3].X,Buf[3].Y); for(k=0;k<4;k++){Buf[k].X+=XOff;Buf[k].Y+=YOff;} if(Average<=WaterLevel){setfillstyle(1,8);setcolor(8);} else{setfillstyle(1,7);setcolor(15);} fillpoly(4,(int *)Buf); } setfillstyle(1,7); j=SIZEY-1; for(i=SX;i<FX;i++) {X=(i-OX); Y=(SIZEY-1-OY); Project(X*kX,Y*kY,HMap[i][j]*kZ,Buf[0].X,Buf[0].Y); Project((X+1)*kX,Y*kY,HMap[i+1][j]*kZ,Buf[1].X,Buf[1].Y); Project((X+1)*kX,Y*kY,ZERO*kZ,Buf[2].X,Buf[2].Y); Project(X*kX,Y*kY,ZERO*kZ,Buf[3].X,Buf[3].Y); for(k=0;k<4;k++){Buf[k].X+=XOff;Buf[k].Y+=YOff;} fillpoly(4,(int *)Buf); } i=SIZEX-1; for(j=SY;j<FY;j++) {X=(SIZEX-1-OX); Y=(j-OY); Project(X*kX,Y*kY,HMap[i][j]*kZ,Buf[0].X,Buf[0].Y); Project(X*kX,Y*kY,ZERO*kZ,Buf[1].X,Buf[1].Y); Project(X*kX,(Y+1)*kY,ZERO*kZ,Buf[2].X,Buf[2].Y); Project(X*kX,(Y+1)*kY,HMap[i][j+1]*kZ,Buf[3].X,Buf[3].Y); for(k=0;k<4;k++){Buf[k].X+=XOff;Buf[k].Y+=YOff;} fillpoly(4,(int *)Buf); } } }
void Done() {closegraph(); }
void InitCam() {float Alpha=atan2(CamY,CamX), Betta=atan2(sqrt(CamX*CamX+CamY*CamY),CamZ), Temp=cos(Betta); XX=cos(Alpha); XY=sin(Alpha); YX=XY*Temp; YY=XX*Temp; YZ=sin(Betta); }
void Project(float X, float Y, float Z, int &px, int &py) {px=XX*X-XY*Y; py=YX*X+YY*Y-YZ*Z; }
void AddWater(int Lvl) {WaterLevel=Lvl; }
void AddHill(int X, int Y, int R, int H) {int MaxH=-128,Temp; int x,y,k,i; while(MaxH<H) {x=X; y=Y; for(i=1;i<R*2;i++) {k=random(9); switch(k){ case 0:x--;y--; break; case 1:y--; break; case 2:x++;y--; break; case 3:x--; break; case 4: break; case 5:x++; break; case 6:x--;y++; break; case 7:y++; break; case 8:x++;y++; break; } } Temp=++HMap[x][y]; if(MaxH<Temp)MaxH=Temp; } }
void AddHole(int X, int Y, int R, int H) {int MinH=128,Temp; int x,y,k,i; while(MinH>H) {x=X; y=Y; for(i=1;i<R*2;i++) {k=random(9); switch(k){ case 0:x--;y--; break; case 1:y--; break; case 2:x++;y--; break; case 3:x--; break; case 4: break; case 5:x++; break; case 6:x--;y++; break; case 7:y++; break; case 8:x++;y++; break; } } Temp=--HMap[x][y]; if(MinH>Temp)MinH=Temp; } }
void AddNoize(int Intensity) {int i,j; int R=Intensity/2; for(i=0;i<SIZEX;i++) for(j=0;j<SIZEY;j++) HMap[i][j]+=random(Intensity)-R; }
|
|
« Последнее редактирование: 09-08-2010 08:54 от Джон »
|
Записан
|
|
|
|