Наверно, это связано с файловыми операциями.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <GL/freeglut.h>
//#include <GL/glut.h>
#define NMAX 4000
#define PMAX 1000000
int N=2000;
int T=1;
int P=100;
int Width=1200, Height=900;
int Z[NMAX], Zii[NMAX], Zjj[NMAX]; //слои и связи
double VX[NMAX], VY[NMAX], X[NMAX], Y[NMAX], VX0[NMAX], VY0[NMAX], X0[NMAX], Y0[NMAX];
double R0=20.0;
double R1=20.0;
void nbodyinit( ) {
static int i;
for(i=0;i<N;i++){
VX[i]=VX0[i];
VY[i]=VY0[i];
X[i]=X0[i];
Y[i]=Y0[i];
}
}
void nbodyread( ) {
static int i,j,ii,jj,i0,j0;
static double x,y,r;
static char c;
//FILE *f;
for(j=0;j<150;j++) { i=j; X[i]=-490; Y[i]=390-5*j; }
for(j=0;j<150;j++) { i=j+150; X[i]=490; Y[i]=390-5*j; }
for(j=0;j<200;j++) { i=j+300; X[i]=5*j-495; Y[i]=380; }
for(j=0;j<200;j++) { i=j+500; X[i]=5*j-495; Y[i]=-340; }
for(i=0;i<700;i++) { VX[i]=0; VY[i]=0; Z[i]=2; Zii[i]=-3; Zjj[i]=-3; }
for(i=700;i<N;i++) {
VX[i]=1.0;
VY[i]=1.0;
Z[i]=3;
Zii[i]=-3; Zjj[i]=-3;
}
j=700;
//f=fopen("0.txt","r");
//fscanf(f,"%i %i \n",&i0,&j0);
scanf("%i %i \n",&i0,&j0);
//for(ii=0,jj=0,c=' ';c!='-';fscanf(f,"%c",&c)) {
for(ii=0,jj=0,c=' ';c!='-';scanf("%c",&c)) {
if(c=='\n'){ jj++; ii=0; } else ii++;
if(c=='0'){
x=(i0+ii)*0.5*R1;
y=(j0-jj)*R1*sqrt(3)*0.5;
X[j]=x-600.0; Y[j]=y-450.0;
Zii[j]=ii; Zjj[j]=jj;
j++;
}
}
//fclose(f);
N=j; printf("N=%d\n",N);
for(i=0;i<N;i++){
VX0[i]=VX[i];
VY0[i]=VY[i];
X0[i]=X[i];
Y0[i]=Y[i];
}
}
void nbodystep( ) {
static double x,x0,x1,x2,y,y0,y1,y2,r0,r1,r2;
static int i, j, jj, z, z0, zii, zjj, zii0, zjj0;
/**/
for(i=700;i<(N-1);i++) {
x0=X[i]; y0=Y[i]; z0=Z[i]; zii0=Zii[i]; zjj0=Zjj[i];
for(j=701;j<N;j++) {
x=X[j]; y=Y[j]; z=Z[j]; zii=Zii[j]; zjj=Zjj[j];
if(
( (zii==(zii0-1)) && (zjj==(zjj0+1)) ) ||
( (zii==(zii0+1)) && (zjj==(zjj0+1)) ) ||
( (zii==(zii0+2)) && (zjj==(zjj0)) )
)
{
x-=x0; y-=y0;
r2=x*x+y*y;
r1=sqrt(r2);
r0=1.0/r1;
r1-=R1;
r1*=r0*0.5;
x*=r1; y*=r1;
VX[i]+=x; VY[i]+=y;
VX[j]-=x; VY[j]-=y;
}
}
}
/**/
//for(i=0;i<(N-1);i++) {
for(i=0;i<700;i++) {
x0=X[i]; y0=Y[i]; z0=Z[i]; //zii0=Zii[i]; zjj0=Zjj[i];
x1=x0-R0; x2=x0+R0; y1=y0-R0; y2=y0+R0;
//if(i>700) jj=i+1; else jj=701;
for(j=701;j<N;j++) {
x=X[j]; y=Y[j]; z=Z[j]; //zii0=Zii[i]; zjj0=Zjj[i];
if(z0&z)if(x1<x)if(x2>x)if(y1<y)if(y2>y) {
x-=x0; y-=y0;
r2=x*x+y*y;
r1=sqrt(r2);
if(R0>r1)
{
r0=1.0/r1;
r1-=R0;
r1*=r0*0.5;
x*=r1; y*=r1;
//VX[i]+=x; VY[i]+=y;
VX[j]-=x; VY[j]-=y;
}
}
}
}
/**/
for(i=700;i<N;i++) {
VX[i]*=0.9989;
VY[i]*=0.9989;
VY[i]+=-0.002;
X[i]+=VX[i]; Y[i]+=VY[i];
}
}
double px[PMAX], py[PMAX];
void Display( void ) {
static int i, t, p;
static double x,y,w,h;
glClearColor( 0, 0, 0, 1 );
glClear( GL_COLOR_BUFFER_BIT );
glEnable(GL_POINT_SMOOTH);
glColor3f( 0.5, 0.5, 0.5 );
glPointSize( 1 );
for(i=0;i<P;i++) {
glBegin( GL_POINTS );
glVertex2f( px[i], py[i] );
glEnd( );
}
t=(t+1)%T;
w=Width*0.5;
h=Height*0.5;
glColor3f( 1, 1, 0 );
glPointSize( 8.0 );
for(i=0;i<N;i++) {
glBegin( GL_POINTS );
x=X[i]+w; y=Y[i]+h;
glVertex2f( x, y );
if(t==0){ p=(p+1)%P; px[p]=x; py[p]=y; }
glEnd( );
}
glFlush( );
}
void Reshape( int w, int h ) {
static int i;
for(i=0;i<P;i++) { px[i]=0; py[i]=0; }
Width = w; Height = h;
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity( );
glOrtho( 0, w, 0, h, -1, 1 );
}
int RUN=0;
void Keyboard( unsigned char key, int x, int y ) {
const char ESCAPE = '\033';
if( key == ESCAPE ) exit( 0 ) ;
else if( key == ' ' ) RUN=1;
else { RUN=0; nbodyinit(); }
}
void idle( void ) {
static int i;
if(RUN)// for(i=0;i<10;i++)
nbodystep( );
glutPostRedisplay( );
}
void main( int argc, char* argv[ ] ) {
static int i;
i=argc; while(i--) {
if(argv[i][0]=='n') sscanf(argv[i],"n%d", &N);
if(argv[i][0]=='t') sscanf(argv[i],"t%d", &T);
if(argv[i][0]=='p') sscanf(argv[i],"p%d", &P);
}
printf("N=%d\n",N);
printf("T=%d\n",T);
printf("P=%d\n",P);
nbodyread( );
nbodyinit( );
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGB );
glutInitWindowSize( Width , Height );
glutInitWindowPosition( 10, 10 );
glutCreateWindow( "Test" );
glutDisplayFunc( Display );
glutReshapeFunc( Reshape );
glutKeyboardFunc( Keyboard );
glutIdleFunc( idle );
glutMainLoop( );
}