# 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);
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);
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);

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);

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.