Demo entry 6870113

wzorcee

   

Submitted by eee on Aug 21, 2019 at 11:44
Language: C++. Code size: 9.7 kB.

// g++ main.cpp -lGL -lglut -lGLU
#include <cstdio>
#include <string>
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <GL/glut.h>
#include "dumpgl2.h"


using namespace std;
const int L = 100;
const double pgc = 0.25;
int tab[L][L];
int tab_new[L][L];
int licznikklatek=0;

int init(void)
{

	/*for(int j=0; j<L; j++)
	{
		for(int i=0; i<L; i++)
		{*/

		for(int j=L; j>=0; j--)
        {
            for(int i=L; i>=0; i--)
            {
		int r = ( int( floor((rand()/float(RAND_MAX+1)) * 3)) - 1);

			tab[i][j] = r;
           if (r != -1 && r!=0 && r!=1){cout << r << endl;}
          // cout << "r: " << r << endl;

        }
    }
}

float WPRIM(float d){                      //funkcja meksykañska z do³o¿onymi za³o¿eniami
    float CE = 0.4, CI = 0.1, dE = 14.0, dI = 42.0;

    float wynik = CE*exp(-(pow(d, 2)/dE))- CI*exp(-(pow(d, 2)/dI));
    return wynik;
}

float dystans(int i1, int j1, int i2, int j2){

        float d =  sqrt(pow(i1-i2, 2)+ pow(j1-j2, 2));
        return d;
}





float WdoE(int i, int j){
        float d0 = 5.4;
        float sumaWdoE = 0;
        float dx = 14;

		 for (int jp = j-d0; jp <= j+d0; jp++){
            for (int ip = i-d0; ip <= i+d0; ip++){

                float d = dystans(i,j,ip,jp);



                if (d < d0){
                sumaWdoE = sumaWdoE + WPRIM(d);
                }
            }
		 }

    return sumaWdoE;
}

float WdoI(int i, int j){
        float d0 = 5.4;
        float dm = 15;
        float sumaWdoI = 0;
        float dx = 14;

        for (int jp = j-dx; jp <= j+dx; jp++){
            for (int ip = i-dx; ip <= i+dx; ip++){

                float d = dystans(i,j,ip,jp);



                if((dm > d)&&  (d >= d0)){
                sumaWdoI = sumaWdoI + WPRIM(d);
                }
            }
        }

    return sumaWdoI;
}
void Wdo(int i, int j,float *wdoe, float *wdoi){
        float d0 = 5.4;
        float dm = 15;
        float dx = 14;
        *wdoe = 0;
        *wdoi = 0;
        for (int jp = j-dx; jp <= j+dx; jp++){
            for (int ip = i-dx; ip <= i+dx; ip++){

                float d = dystans(i,j,ip,jp);



                if((dm > d)&&  (d >= d0)){
                *wdoi = *wdoi + WPRIM(d);
                }
                else if (d < d0){
                *wdoe = *wdoe + WPRIM(d);}
            }
        }


}
float funkcjaW(int i, int j, int ip, int jp){

    // cout << wynik <<endl;
    float d0 = 5.4;
    float dm = 15;
    float WE = 68;
    float WI = -300;
    float dx = 14;
    float wynikFunkcjiW;


    float d = dystans(i,j,ip,jp);


    float Wp = WPRIM(d);
    float wdoe = 0;
    float wdoi = 0;
    Wdo(i,j,&wdoe,&wdoi);
    if (d < d0){

        wynikFunkcjiW = (WE*Wp)/wdoe;

    }        //je¿eli d pomiedzy i,j a i',j' jest mniejsze od d0=5.4 to wynikFunkcjiW >= 0; INTERAKCJE POBUDZAJ¥CE


    else if((dm > d)&&  (d >= d0)){

        wynikFunkcjiW = (WI*Wp)/wdoi;

                            //  INTERAKCJE HAMUJ¥CE, wynikFunkcjiW < 0;
    }

    else if(d >= dm){
            wynikFunkcjiW = 0;}


        //     cout <<d << " " << wynikFunkcjiW<<endl;



return wynikFunkcjiW;//  wynik = 0;

}

float Heavy(float x){
            int H;
            if (x < 0){H = 0;}
            else {H = 1;}
            return H;
}



float I(int i, int j){
         float I = 0;
         float dx = 14;
		 for (int jp = j-dx; jp <= j+dx; jp++){
            for (int ip = i-dx; ip <= i+dx; ip++){

          //  cout << ip<< ","<< jp<<" p1 " << I<<endl;
                float d = dystans(i,j,ip,jp);

                int ipp,jpp;

                if      (ip < 0){ipp = L + ip;}
                else if (ip >= L)  {ipp = ip - L;}
                else {ipp=ip;}

                if       (jp < 0)   {jpp = L + jp;}
                else if (jp >= L)  {jpp = jp - L;}
                else {jpp=jp;}

                int x = tab[ipp][jpp]-1;
                I = I + funkcjaW(i,j,ip,jp) *  Heavy(x);
        }
    }
    return I;
}


int changestate(void)
{


	for(int j=0; j<L; j++)
	{
		for(int i=0; i<L; i++)
		{
		//  cout << "a," << i<<" " << j <<endl;
            if(tab[i][j] == 0 ){

                    int uth = 2;
                    int x2 = (I(i,j) - uth);            // warunek I - dla stanu spoczynku = 0
              // cout << "d2"<<endl;
                tab_new[i][j] = Heavy(x2); //z mienia siê na zero lub 1 w zaleznosci od H(I - uth)
             }
             else if(tab[i][j] == 1 ){
              //      cout << " b" << endl;//powinien byc czerwony - warunek II - dla stanu aktywacji = 1, po prostu jeœli jest jedynk¹ to w kolejnym kroku bêdzie równe -1
                tab_new[i][j] = -1; //i zmieniac sie na czarny
             }
             else if(tab[i][j] == -1 ){ //warunek III - dla stanu refrakcji = -1
          //  cout << "c"<<endl;
                         double pg = ((rand()/float(RAND_MAX)) ); //losujê miedzy 0 a 1
                         if (pg <= pgc){
                         tab_new[i][j] = 0;
                             }
                         else
                         {
                         tab_new[i][j] = -1;
                         }
            }
            tab[i][j]=tab_new[i][j];
        }
    }

}





void changeSize(int w, int h)
{
	float ratio = 1.0 * w / h;
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glViewport(0, 0, w, h);
	gluOrtho2D(-1,1,-1,1);
	glMatrixMode(GL_MODELVIEW);
}

void renderScene(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glColor3f(1,1,1);
	/*glPointSize(5.0);
	glBegin(GL_POINTS);
		glVertex3f(px_cpu, py_cpu,0);
	glEnd();*/

	 string workbuf;
		//sprintf(workbuf, "frame%04d.ppm");
        workbuf="klatka"+to_string(licznikklatek)+".ppm";
		ofstream plik(workbuf, ios::app);
		//cout << n/float(NX*NY) << " " << M/float(n) << endl;

		if( plik.good() == true )
    {
   //     std::cout << "Uzyskano dostep do pliku!" << std::endl;
    plik << "P3" << endl << L << " " << L << endl << "255" << endl;
        //tu operacje na pliku
    } //else std::cout << "Dostep do pliku zostal zabroniony!" << std::endl;

	for(int j=0; j<L; j++)
	for(int i=0; i<L; i++)
	{
		float x = 2.0 * ( i / float(L) ) - 1.0;		// mapowanie
		float y = 2.0 * ( j / float(L) ) - 1.0;		// mapowanie
		float delta = 2.0 / L;

		float r=0,g=0,b=0;
		if(tab[i][j] == 0) { r=0,g=255,b=0; }   //zielony
		if(tab[i][j] == 1) { r=255,g=0,b=0; }   //czerwony
		if(tab[i][j] == -1) { r=0; g=0,b=0; } //czarny

        plik << r << " " << g << " " << b << endl;


		glColor3f(r,g,b);

		glBegin(GL_QUADS);
			glVertex2f(x,y);
			glVertex2f(x+delta,y);
			glVertex2f(x+delta,y+delta);
			glVertex2f(x,y+delta);
		glEnd();
	}
    plik.close();
    licznikklatek++;
	glutSwapBuffers();
}
void idleFunction(void)
{

    /*std::fstream plik;
    plik.open( "plik1.ppm", std::ios::in | std::ios::out );
    if( plik.good() == true )
    {
        std::cout << "Uzyskano dostep do pliku!" << std::endl;
        plik.close();
        //tu operacje na pliku
    } else std::cout << "Dostep do pliku zostal zabroniony!" << std::endl;*/

    changestate();

    sg_glDumpWindow(L,L);
	glutPostRedisplay();
	//plik.close();
}

void timer(int v)
{

	//px_cpu += 0.01;
	//if(px_cpu > 1) px_cpu=-1;
	glutTimerFunc(10, timer, 0);
}
void key(unsigned char key, int x, int y)
{
	if(key== ' ')
    {
		changestate();
		sg_glDumpWindow(L,L);

    }
	if (key == 27)
		exit(0);
}

int main(int argc, char **argv)
{

    srand(1000);
   // srand(time(NULL));

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(320,320);
	glutCreateWindow("GLUT, przyklad");


    init();



/*for(int j=0; j<L; j++)
	{
		for(int i=0; i<L; i++)
		{
         float dx = 14;
		 for (int jp = j-dx; jp <= j+dx; jp++){
            for (int ip = i-dx; ip <= i+dx; ip++){

                double d = dystans(i,j,ip,jp);
                int ipp,jpp;

                if      (ip < 0){ipp = L + ip;}
                else if (ip >= L)  {ipp = ip - L;}
                else {ipp=ip;}

                if       (jp < 0)   {jpp = L + jp;}
                else if (jp >= L)  {jpp = jp - L;}
                else {jpp=jp;}

 //cout <<d <<endl;
 //  Wd(d);
  // cout <<d <<endl;
  //int x = tab[ipp][jpp]-1;
//   cout<< "i:" <<i<<"j:"<<j<<" ip:"<< ip << " jp:"<< jp<<" ipp:"<< ipp << " jpp:"<< jpp<<  " uij:"<< tab[ipp][jpp]<<" x: " << x <<endl;
  //Heavy(x);
// cout<<" H:" << Heavy(x) << endl;
//cout <<d <<endl;
 //   I(i,j);
 //if(I(i,j)!=0)
  //  cout << "i:" <<i<<", j:"<<j<<" ip:"<< ip << " jp:"<< jp<<" ipp:"<< ipp << " jpp:"<< jpp<<  " uij:"<< tab[ipp][jpp]<< ", x:"<<x <<", H(x):" << Heavy(x)<< ", d:"<<d<<", Wd(d):"<<Wd(d) << "Funkcja I(i,j)=" <<I(i,j) <<endl;
  //  cout <<d <<endl;
 //  int uth = 2;
 //   int x2 = (I(i,j) - uth);
 //   Heavy(x2);
   //  cout<<" H2:" << Heavy(x2) << endl;
  //  test2();
  //   sg_glDumpWindow(L,L);
            }
        }
    }
}
*/






	// register callbacks
	glutDisplayFunc(renderScene);
	glutKeyboardFunc(key);
	glutReshapeFunc(changeSize);
	glutIdleFunc(idleFunction);
	glutTimerFunc(120, timer, 0);
	// enter GLUT event processing cycle
	glutMainLoop();
}

This snippet took 0.02 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).