Optimize Code
in
Core Library Questions
•
1 year ago
Hello, I wrote a sketch. Which displays rotating cube which consist of small boxes and these boxes fly away from cube. When number of cubes by one side is 10, everything is ok, if I increase number of cubes all animation begin to freeze.
I`m new in processing and programming at all, so please help me optimize my code.
- import processing.opengl.*;
- int initFrame = 20;
- int boxSize = 60; //
- int boxCount = 10; //number of boxes on one axis
- int wndW = screen.width; //
- int wndH = screen.height; //
- Cube[][][] cubes = new Cube[boxCount][boxCount][boxCount]; //инициализируем 3х мерный массив из 100 кубиков
- ArrayList freeCubes = new ArrayList(); //list for the cubes which can be moved
- float rx = -0.38;
- float ry = -5.28;
- float rz=0;
- //float xmag, ymag = 0;
- //float newXmag, newYmag = 0;
- void setup()
- {
- size(wndW, wndH,OPENGL);
- background(0);
- smooth();
- frameRate(60);
- noStroke();
- stroke(0);
- lights();
- //Создаем массив кубиков
- for (int x=0;x<boxCount;x=x+1) {
- for (int y=0;y<boxCount;y=y+1) {
- for (int z=0;z<boxCount;z=z+1) {
- cubes[x][y][z] = new Cube(x,y,z,x,y,z,boxSize,false, false, false, false, false, false, false, false);
- //setFreeCubes(cubes[x][y][z]);
- }
- }
- }
- setFreeCubes();
- //println (freeCubes.size());
- }
- //Функция определения кубиков, которые могут двигаться
- void setFreeCubes()
- {
- int nx;
- int ny;
- int nz;
- boolean result = true;
- Cube cube;
- for (int x=0;x<boxCount;x=x+1) {
- for (int y=0;y<boxCount;y=y+1) {
- for (int z=0;z<boxCount;z=z+1) {
- cube = cubes[x][y][z];
- nx = cube.getNX();
- ny = cube.getNY();
- nz = cube.getNZ();
- if (nx==0) { cube.setFreeXn(true); }
- if (nx==boxCount-1) { cube.setFreeXp(true); }
- if (ny==0) { cube.setFreeYn(true); }
- if (ny==boxCount-1) { cube.setFreeYp(true); }
- if (nz==0) { cube.setFreeZn(true); }
- if (nz==boxCount-1) { cube.setFreeZp(true); }
- if (nx>0 && nx<round(boxSize/2)) {
- for (int i=0;i<nx;i=i+1) {
- if (cubes[i][ny][nz].isMoving() == false) {
- result = false;
- }
- }
- if (cube.isMoving() == false) { cube.setFreeXn(result); }
- }
- result = true;
- if (nx>=round(boxSize/2) && nx<boxSize-1) {
- for (int i=nx;i<boxSize;i=i+1) {
- if (cubes[i][ny][nz].isMoving() == false) {
- result = false;
- }
- }
- if (cube.isMoving() == false) { cube.setFreeXp(result); }
- }
- result = true;
- if (ny>0 && ny<round(boxSize/2)) {
- for (int i=0;i<ny;i=i+1) {
- if (cubes[nx][i][nz].isMoving() == false) {
- result = false;
- }
- }
- if (cube.isMoving() == false) { cube.setFreeYn(result); }
- }
- result = true;
- if (ny>=round(boxSize/2) && ny<boxSize-1) {
- for (int i=ny;i<boxSize-1;i=i+1) {
- if (cubes[nx][i][nz].isMoving() == false) {
- result = false;
- }
- }
- if (cube.isMoving() == false) { cube.setFreeYp(result); }
- }
- result = true;
- if (nz>0 && nz<round(boxSize/2)) {
- for (int i=0;i<nz;i=i+1) {
- if (cubes[nx][ny][i].isMoving() == false) {
- result = false;
- }
- }
- if (cube.isMoving() == false) { cube.setFreeZn(result); }
- }
- result = true;
- if (nz>=round(boxSize/2) && nz<boxSize-1) {
- for (int i=nz;i<boxSize-1;i=i+1) {
- if (cubes[nx][ny][i].isMoving() == false) {
- result = false;
- }
- }
- if (cube.isMoving() == false) { cube.setFreeZp(result); }
- }
- if ((cube.getFreeXp() == true || cube.getFreeXn() == true || cube.getFreeYp() == true || cube.getFreeYn() == true || cube.getFreeZn() == true || cube.getFreeZp() == true) && cube.isMoving() == false && cube.isInList() == false) {
- freeCubes.add(cube);
- cube.setInList(true);
- }
- }
- }
- }
- }
- void draw()
- {
- int cubeNumber = 0; //Номер свободного кубика
- background(0);
- translate (wndW/2-boxSize*boxCount/2,wndH/2-boxSize*boxCount/2,-400); //Центруем кубик в окне
- /*
- newXmag = mouseX/float(width) * TWO_PI;
- newYmag = mouseY/float(height) * TWO_PI;
- float diff = xmag-newXmag;
- if (abs(diff) > 0.01) { xmag -= diff/4.0; }
- diff = ymag-newYmag;
- if (abs(diff) > 0.01) { ymag -= diff/4.0; }
- rotateX(-ymag);
- rotateY(-xmag);
- */
- rx=rx+0.005;
- ry=ry+0.005;
- rz=rz+0.005;
- rotateX(rx);
- rotateY(ry);
- rotateZ(rz);
- if (frameCount%initFrame == 0) {
- if (freeCubes.size() >0 ) {
- cubeNumber = round(random(0,freeCubes.size()-1)); //Берем случайный номер из списка
- Cube cube= (Cube) freeCubes.get(cubeNumber); //Получаем объект кубика по номеру
- cube.setMov(true);
- //println ("x - "+cube.getX()+" y - "+cube.getY()+ " z - "+cube.getX());
- freeCubes.remove(cubeNumber); //Удаляем даижущийся кубик из списка
- setFreeCubes();
- }
- else {
- for (int x=0;x<boxCount;x=x+1) {
- for (int y=0;y<boxCount;y=y+1) {
- for (int z=0;z<boxCount;z=z+1) {
- cubes[x][y][z] = new Cube(x,y,z,x,y,z,boxSize,false, false, false, false, false, false, false, false);
- }
- }
- }
- setFreeCubes();
- }
- }
- for (int x=0;x<boxCount;x=x+1) {
- for (int y=0;y<boxCount;y=y+1) {
- for (int z=0;z<boxCount;z=z+1) {
- pushMatrix();
- cubes[x][y][z].drawCube();
- popMatrix();
- }
- }
- }
- //println("size - "+freeCubes.size() + "number - "+cubeNumber);
- }
- class Cube
- {
- int boxSize; //размер кубика
- int x,y,z; //координаты кубика
- int nx,ny,nz; //номер кубика на оси
- boolean freeXp, freeYp, freeZp; //свободна ли ось в сторону положительных значений
- boolean freeXn, freeYn, freeZn; //свободна ли ось в сторону отрицательных значений
- boolean inList;
- boolean mov; //кубик или движется или нет
- //цвет кубика
- int r=round(random(0,255));
- int g=round(random(0,255));
- int b=round(random(0,255));
- //Конструктор
- Cube(int x, int y, int z, int nx, int ny, int nz, int boxSize, boolean mov, boolean freeXp, boolean freeXn, boolean freeYp, boolean freeYn, boolean freeZp, boolean freeZn, boolean inList)
- {
- //Задаем начальные координаты кубика исходя из его положения
- this.x = nx*boxSize;
- this.y = ny*boxSize;
- this.z = nz*boxSize;
- this.mov = mov;
- this.freeXn = freeXn;
- this.freeYn = freeYn;
- this.freeZn = freeZn;
- this.freeXp = freeXp;
- this.freeYp = freeYp;
- this.freeZp = freeZp;
- this.nx = nx;
- this.ny = ny;
- this.nz = nz;
- this.inList = inList;
- this.boxSize = boxSize;
- }
- void drawCube()
- {
- fill(r,g,b);
- if (mov == true) {
- if (freeXn == true) { setXMov(1); } else if ( freeXp == true ) { setXMov(-1); }
- else if (freeYn == true) { setYMov(1); } else if ( freeYp == true ) { setYMov(-1); }
- else if (freeZn == true) { setZMov(1); } else if ( freeZp == true ) { setZMov(-1); }
- }
- if (x>1000 || y>1000 || z>1000 ||x<-1000 || y<-1000 || z<-1000)
- {//this.r=0;this.g=0;this.b=0;
- }
- else
- {
- translate(x,y,z);
- box(boxSize);
- }
- }
- //Методы для изменения координат кубика
- void setXMov(int x) { this.x = this.x-(x*2); }
- void setYMov(int y) { this.y = this.y-(y*2); }
- void setZMov(int z) { this.z = this.z-(z*2); }
- //Методы для получения номера кубка
- int getNX() { return this.nx; }
- int getNY() { return this.ny; }
- int getNZ() { return this.nz; }
- boolean isMoving() { if (this.mov == false) { return false; } else { return true; } }
- void setMov(boolean mov) { this.mov = mov; }
- //Методы для установки свободности по оси
- void setFreeXn(boolean freeXn) { this.freeXn = freeXn; }
- void setFreeXp(boolean freeXp) { this.freeXp = freeXp; }
- void setFreeYn(boolean freeYn) { this.freeYn = freeYn; }
- void setFreeYp(boolean freeYp) { this.freeYp = freeYp; }
- void setFreeZn(boolean freeZn) { this.freeZn = freeZn; }
- void setFreeZp(boolean freeZp) { this.freeZp = freeZp; }
- //Методы для получения свободности по оси
- boolean getFreeXn() { return this.freeXn; }
- boolean getFreeXp() { return this.freeXp; }
- boolean getFreeYn() { return this.freeYn; }
- boolean getFreeYp() { return this.freeYp; }
- boolean getFreeZn() { return this.freeZn; }
- boolean getFreeZp() { return this.freeZp; }
- void setInList(boolean inList) { this.inList = inList; }
- boolean isInList() { if (this.inList == false) { return false; } else { return true; } }
- }
1