Created
May 29, 2012 18:09
-
-
Save tatar1nro/2829812 to your computer and use it in GitHub Desktop.
Волновой гексагональный алогритм
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include "stdafx.h" | |
| #include <iostream> | |
| #include <vector> | |
| //#include "glut.h" | |
| //#pragma comment(lib, "glut32.lib") | |
| using namespace std; | |
| double h,t=0; | |
| vector <vector <int> > v; | |
| //void renderScene(void); | |
| void keyboard(unsigned char a, int, int); | |
| int angleX = 0; | |
| int angleY = 0; | |
| int angleZ = 0; | |
| class pole | |
| { | |
| public: | |
| int num; | |
| pole(); | |
| void init_point(int x, int y); | |
| void end_point(int x, int y); | |
| void barrier(int x, int y); | |
| void print(); | |
| void func(); | |
| int alg(); | |
| }; | |
| pole::pole() | |
| { | |
| cout << "Enter number of elements: "; | |
| cin >> num; | |
| v.resize(num); | |
| for(int i=0; i<num; i++) | |
| { | |
| if(i%2==0) | |
| { | |
| v[i].resize(num); | |
| } | |
| else v[i].resize(num-1); | |
| } | |
| } | |
| void pole::func() | |
| { | |
| h=num; | |
| } | |
| void pole::init_point(int x, int y) | |
| { | |
| if(x>=(num-1)||y>=num||x<0||y<0||v[y][x]!=0) | |
| { | |
| cout << "incorrect input!"; | |
| } | |
| else | |
| { | |
| v[y][x]=1; | |
| cout << "OK" << endl; | |
| } | |
| } | |
| void pole::end_point(int x, int y) | |
| { | |
| if(x>=(num-1)||y>=num||x<0||y<0||v[y][x]!=0) | |
| { | |
| cout << "incorrect input!"; | |
| } | |
| else | |
| { | |
| v[y][x]=-1; | |
| cout << "OK" << endl; | |
| } | |
| } | |
| void pole::barrier(int x, int y) | |
| { | |
| if(x>=(num-1)||y>=num||x<0||y<0||v[y][x]!=0) | |
| { | |
| cout << "incorrect input!"; | |
| } | |
| else | |
| { | |
| v[y][x]=-2; | |
| cout << "OK" << endl; | |
| } | |
| } | |
| void pole::print() | |
| { | |
| for(int i=0; i<num; i++) | |
| { | |
| if(i%2==0) | |
| { | |
| for(int j=0; j<num; j++) | |
| { | |
| cout << v[i][j]<< ' '; | |
| } | |
| } | |
| else | |
| { | |
| for(int j=0; j<(num-1); j++) | |
| { | |
| cout << v[i][j]<< ' '; | |
| } | |
| } | |
| cout << endl; | |
| } | |
| cout << endl; | |
| } | |
| int pole::alg() | |
| { | |
| int num1=0, i=1; | |
| bool flg1 = false; | |
| bool flg2 = false; | |
| while(1) | |
| { | |
| flg2=false; | |
| for(int j=0; j<num; j++) | |
| { | |
| if(j%2==0) | |
| { | |
| num1=num; | |
| } | |
| else num1=num-1; | |
| for(int k=0; k<num1; k++) | |
| { | |
| if(v[j][k]==i) | |
| { | |
| //раз | |
| if(j<(num-1)&&k<(num-1)) | |
| { | |
| if(v[j+1][k]==0) | |
| { | |
| v[j+1][k]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j+1][k]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| //два | |
| if(j>0&&k<(num-1)) | |
| { | |
| if(v[j-1][k]==0) | |
| { | |
| v[j-1][k]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j-1][k]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| //три | |
| if(k<(num1-1)) | |
| { | |
| if(v[j][k+1]==0) | |
| { | |
| v[j][k+1]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j][k+1]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| //четыре | |
| if(k>0) | |
| { | |
| if(v[j][k-1]==0) | |
| { | |
| v[j][k-1]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j][k-1]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| if(j%2==0) | |
| { | |
| //пять | |
| if(k>0&&j>0&&k<(num-1)) | |
| { | |
| if(v[j-1][k-1]==0) | |
| { | |
| v[j-1][k-1]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j-1][k-1]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| //шесть | |
| if(k>0&&j<(num-1)&&k<(num-1)) | |
| { | |
| if(v[j+1][k-1]==0) | |
| { | |
| v[j+1][k-1]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j+1][k-1]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| //пять | |
| if(k<(num1-1)&&j>0) | |
| { | |
| if(v[j-1][k+1]==0) | |
| { | |
| v[j-1][k+1]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j-1][k+1]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| //шесть | |
| if(k<(num1-1)&&j<(num-1)) | |
| { | |
| if(v[j+1][k+1]==0) | |
| { | |
| v[j+1][k+1]=i+1; | |
| flg2=true; | |
| } | |
| else if(v[j+1][k+1]==-1) | |
| { | |
| cout << "Way be found for " << i << " steps" << endl; | |
| print(); | |
| flg1=true; | |
| flg2=true; | |
| break; | |
| //return 0; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| if(flg1==true) | |
| { | |
| break; | |
| } | |
| } | |
| if(flg1==true) | |
| { | |
| break; | |
| } | |
| if(flg2==false) | |
| { | |
| cout << "Way not found!"; | |
| break; | |
| } | |
| //print(); | |
| i++; | |
| } | |
| i++; | |
| bool flag1=false; | |
| if(flg2 == true) | |
| { | |
| while(i!=1) | |
| { | |
| flag1=false; | |
| for(int j=0; j<num; j++) | |
| { | |
| if(j%2==0) | |
| { | |
| num1=num; | |
| } | |
| else num1=num-1; | |
| for(int k=0; k<num1; k++) | |
| { | |
| if(v[j][k]==i) | |
| { | |
| if(flag1==false) | |
| { | |
| if(j<(num-1)&&k<(num-1)) | |
| { | |
| if(v[j+1][k]==i+1||v[j+1][k]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| //два | |
| if(j>0&&k<(num-1)) | |
| { | |
| if(v[j-1][k]==i+1||v[j-1][k]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| //три | |
| if(k<(num1-1)) | |
| { | |
| if(v[j][k+1]==i+1||v[j][k+1]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| //четыре | |
| if(k>0) | |
| { | |
| if(v[j][k-1]==i+1||v[j][k-1]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| if(j%2==0) | |
| { | |
| //пять | |
| if(k>0&&j>0&&k<(num-1)) | |
| { | |
| if(v[j-1][k-1]==i+1||v[j-1][k-1]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| //шесть | |
| if(k>0&&j<(num-1)&&k<(num-1)) | |
| { | |
| if(v[j+1][k-1]==i+1||v[j+1][k-1]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| } | |
| else | |
| { | |
| //пять | |
| if(k<(num1-1)&&j>0) | |
| { | |
| if(v[j-1][k+1]==i+1||v[j-1][k+1]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| //шесть | |
| if(k<(num1-1)&&j<(num-1)) | |
| { | |
| if(v[j+1][k+1]==i+1||v[j+1][k+1]==-1) | |
| { | |
| flag1=true; | |
| //flag2=true; | |
| continue; | |
| } | |
| } | |
| } | |
| v[j][k]=0; | |
| } | |
| else v[j][k]=0; | |
| } | |
| } | |
| } | |
| i--; | |
| } | |
| } | |
| return 0; | |
| } | |
| /* | |
| void renderScene(void) { | |
| glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | |
| glLoadIdentity(); | |
| glRotatef(angleX,1,0,0); | |
| glRotatef(angleY,0,1,0); | |
| glRotatef(angleZ,0,0,1); | |
| glTranslatef(0,0,0); | |
| int n1=0, m=0; | |
| for(int j=0; j<h; j++) | |
| { | |
| if(j%2==0) | |
| { | |
| n1=h; | |
| t=2.0/h; | |
| } | |
| else | |
| { | |
| t=3.0/h; | |
| n1=h-1; | |
| } | |
| for(int i=0; i<n1; i++) | |
| { | |
| if(v[j][i]!=0) | |
| { | |
| m=(v[j][i])%5+1; | |
| glColor3f(0.2*m,0.1*m,0); | |
| if(v[j][i]==1) | |
| { | |
| glColor3f(0,1,0); | |
| } | |
| else if(v[j][i]==-1) | |
| { | |
| glColor3f(0,0,1); | |
| } | |
| else if(v[j][i]==-2) | |
| { | |
| glColor3f(1,0,0); | |
| } | |
| glBegin(GL_POLYGON); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glEnd(); | |
| glBegin(GL_POLYGON); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| //1 | |
| glBegin(GL_QUADS); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| //2 | |
| glBegin(GL_QUADS); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| //3 | |
| glBegin(GL_QUADS); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| //4 | |
| glBegin(GL_QUADS); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| //5 | |
| glBegin(GL_QUADS); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| //6 | |
| glBegin(GL_QUADS); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| glBegin(GL_LINES); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| glColor3f(1,1,1); | |
| glBegin(GL_LINES); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| glBegin(GL_LINES); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| glBegin(GL_LINES); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| glBegin(GL_LINES); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| glBegin(GL_LINES); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| glBegin(GL_LINE_LOOP); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0.1); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0.1); | |
| glEnd(); | |
| } | |
| glBegin(GL_LINE_LOOP); | |
| glColor3f(1,1,1); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d((-1+(2.0*i/h)-(1.0/h)+t),(1-2.0*j/h)-(2.0/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(1.5/h)+0.5*j/h, 0); | |
| glVertex3d(-1+(2.0*i/h)-(2.0/h)+t,(1-2.0*j/h)-(0.5/h)+0.5*j/h, 0); | |
| glEnd(); | |
| } | |
| } | |
| glutSwapBuffers(); | |
| } | |
| void keyboard(unsigned char a, int, int) | |
| { | |
| switch(a) { | |
| case 'x' : | |
| angleX = angleX + 10; | |
| glutPostRedisplay(); | |
| break; | |
| case 'X' : | |
| angleX = angleX - 10; | |
| glutPostRedisplay(); | |
| break; | |
| case 'y' : | |
| angleY = angleY + 10; | |
| glutPostRedisplay(); | |
| break; | |
| case 'Y' : | |
| angleY = angleY - 10; | |
| glutPostRedisplay(); | |
| break; | |
| case 'z' : | |
| angleZ = angleZ + 10; | |
| glutPostRedisplay(); | |
| break; | |
| case 'Z' : | |
| angleZ = angleZ - 10; | |
| glutPostRedisplay(); | |
| break; | |
| } | |
| } | |
| */ | |
| void main(int argc, char **argv) | |
| { | |
| //glutInit(&argc, argv); | |
| //glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); | |
| //glEnable(GL_DEPTH_TEST); | |
| //glutInitWindowPosition(100,100); | |
| //glutInitWindowSize(320,320); | |
| //glutCreateWindow("Wave Algorithm"); | |
| //glutDisplayFunc(renderScene); | |
| //glutKeyboardFunc(keyboard); | |
| pole p; | |
| p.func(); | |
| int x=0, y=0; | |
| cout << "Enter init X and Y coordinate" << endl; | |
| cout << "X: "; | |
| cin >> x; | |
| cout << "Y: "; | |
| cin >> y; | |
| p.init_point(x,y); | |
| cout << "Enter end X and Y coordinate" << endl; | |
| cout << "X: "; | |
| cin >> x; | |
| cout << "Y: "; | |
| cin >> y; | |
| p.end_point(x,y); | |
| bool flg=true; | |
| while(1) | |
| { | |
| cout <<"Do you want enter barrier?(1|0): "; | |
| cin >> flg; | |
| if(flg==false) | |
| { | |
| cout << "OK" << endl; | |
| break; | |
| } | |
| cout << "Enter barrier X and Y coordinate" << endl; | |
| cout << "X: "; | |
| cin >> x; | |
| cout << "Y: "; | |
| cin >> y; | |
| p.barrier(x,y); | |
| } | |
| int o=p.num-2; | |
| for(int z=0; z<p.num-2; z++) | |
| { | |
| if(z==o||z==o-1) | |
| { | |
| continue; | |
| } | |
| p.barrier(o, z); | |
| p.barrier(o-1, z); | |
| o--; | |
| if(o-16>0&&z-15>0) | |
| { | |
| p.barrier(o-15, z-15); | |
| p.barrier(o-16, z-15); | |
| } | |
| } | |
| p.print(); | |
| p.alg(); | |
| // glutMainLoop(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment