| 
			| 
					
						| 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 от Джон » |  Записан | 
 |  |  |