‹ Construct2  

Construct2_3d

See /f0blog/useless-supercollider-class-no-2/

//
//  Construct2_3d
//
//  Copyright (c) 2003 Fredrik Olofsson Musikproduktion. All rights reserved.
//
//  040920 ported to processing
//  060227 3d version for processing
//  200801 updated for processing3
//----------------------------------------------------------------------------------------
int step_X, step_Y, step_Z;
int x= 10, y= 10, z= 10;
int dx= 1, dy= 1, dz= 1;
int v;                      //variant
int m;                      //mapping
int col, row, depth;
int mov_X= 95, mov_Y= 95, mov_Z= 95;
int max_XPerCol, max_YPerRow, max_ZPerDepth;

void setup() {
  size(640, 480, P3D);
  frameRate(60);
  background(255);
  nytt();
}

void mousePressed() {
  background(255);
  nytt();
}

void keyTyped() {
  if (key==' ') {
    background(255);
    nytt();
  }
}

void draw() {
  if (int(random(1881))==0) {                 //lite då och då
    background(255);                         //rensa skärmen
    nytt();                                  //nya värden
  }
  drawFO();                                  //rita punkt(er)

  x= x+(dx*step_X);                          //flytta position x
  if (x<1)                                    //om vänster kant
    dx= int(random(2));                      //vänd eller stå still i x-led
  else if (x>max_XPerCol)                     //om höger kant
    dx= 0-int(random(2));                    //vänd eller stå still i x-led

  y= y+(dy*step_Y);                          //flytta position y
  if (y<1)                                    //om övre kanten
    dy= int(random(2));                      //vänd eller stå still i y-led
  else if (y>max_YPerRow)                     //om nedre kanten
    dy= 0-int(random(2));                    //vänd eller stå still i y-led

  z= z+(dz*step_Z);                          //flytta position z
  if (z<1)                                    //om botten
    dz= int(random(2));                      //vänd eller stå still i z-led
  else if (z>max_ZPerDepth)                   //om högst upp
    dz= 0-int(random(2));                    //vänd eller stå still i z-led

  switch(v) {
  case 1:
    variant1();
    break;
  case 2:
    variant2();
    break;
  case 3:
    variant3();
    break;
  case 4:
    variant4();
    break;
  case 5:
    variant5();
    break;
  case 6:
    variant6();
    break;
  case 7:
    variant7();
    break;
  case 8:
    variant8();
    break;
  case 9:
    variant9();
    break;
  case 10:
    variant10();
    break;
  }
}

//----------------------------------------------------------------------------------------
void variant1() {                              //1. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    slumpaRiktningX();
  }
  if (random(100)>=mov_Y) {
    slumpaRiktningY();
  }
  if (random(100)>=mov_Z) {
    slumpaRiktningZ();
  }
}
void variant2() {                              //2. slumpa alltid riktningar tillsammans
  slumpaRiktningXYZ();
}
void variant3() {                              //3. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draVanster();
  }
  if (random(100)>=mov_Y) {
    draUppat();
  }
  if (random(100)>=mov_Z) {
    draHogre();
  }
}
void variant4() {                              //4. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draHoger();
  }
  if (random(100)>=mov_Y) {
    draUppat();
  }
  if (random(100)>=mov_Z) {
    draHogre();
  }
}
void variant5() {                              //5. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draVanster();
  }
  if (random(100)>=mov_Y) {
    draNedat();
  }
  if (random(100)>=mov_Z) {
    draHogre();
  }
}
void variant6() {                              //6. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draHoger();
  }
  if (random(100)>=mov_Y) {
    draNedat();
  }
  if (random(100)>=mov_Z) {
    draHogre();
  }
}
void variant7() {                              //7. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draVanster();
  }
  if (random(100)>=mov_Y) {
    draUppat();
  }
  if (random(100)>=mov_Z) {
    draLagre();
  }
}
void variant8() {                              //8. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draHoger();
  }
  if (random(100)>=mov_Y) {
    draUppat();
  }
  if (random(100)>=mov_Z) {
    draLagre();
  }
}
void variant9() {                              //9. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draVanster();
  }
  if (random(100)>=mov_Y) {
    draNedat();
  }
  if (random(100)>=mov_Z) {
    draLagre();
  }
}
void variant10() {                             //10. slumpa riktningar individuellt
  if (random(100)>=mov_X) {
    draHoger();
  }
  if (random(100)>=mov_Y) {
    draNedat();
  }
  if (random(100)>=mov_Z) {
    draLagre();
  }
}

//----------------------------------------------------------------------------------------
void nytt() {
  v= int(random(10))+1;        //variant
  m= int(random(36));          //mapping
  col= int(random(15))+1;
  row= int(random(13))+1;
  depth= int(random(11))+1;
  max_XPerCol= width/col;
  max_YPerRow= height/row;
  max_ZPerDepth= int((random(600)+20))/depth;
  step_X= 1;
  //step_X= int(random(2))+1;
  step_Y= 1;
  //step_Y= int(random(2))%2)+1;
  step_Z= 1;
  //step_Z= int(random(2))+1;
  slumpaRiktningXYZ();
  //println("v:"+v+" m:"+m+" col:"+col+" row:"+row+" depth:"+depth+" max_XPerCol:"+max_XPerCol+" max_YPerRow:"+max_YPerRow+" max_ZPerDepth:"+max_ZPerDepth);
  stroke(random(255), 55, 66);
}
void slumpaRiktningX() {
  dx= int(random(2));
}
void slumpaRiktningY() {
  dy= int(random(2));
}
void slumpaRiktningZ() {
  dz= int(random(2));
}
void slumpaRiktningXYZ() {
  while ((dx==0)&&(dy==0)&&(dz==0)) {                  //kolla att inte alla riktningar blir 0
    dx= int(random(2));
    dy= int(random(2));
    dz= int(random(2));
  }
}
void draVanster() {
  if (dx==0&&x>=1) {
    dx= -1;
  } else {
    dx= 0;
  }             //dra åt vänster
}
void draHoger() {
  if (dx==0&&x<=max_XPerCol) {
    dx= 1;
  } else {
    dx= 0;
  }    //dra åt höger
}
void draNedat() {
  if (dy==0&&y<=max_YPerRow) {
    dy= 1;
  } else {
    dy= 0;
  }    //dra nedåt
}
void draUppat() {
  if (dy==0&&y>=1) {
    dy= -1;
  } else {
    dy= 0;
  }             //dra uppåt
}
void draHogre() {
  if (dz==0&&z>=1) {
    dz= -1;
  } else {
    dz= 0;
  }             //dra högre
}
void draLagre() {
  if (dz==0&&z<=max_ZPerDepth) {
    dz= 1;
  } else {
    dz= 0;
  }  //dra lägre
}

//----------------------------------------------------------------------------------------
void drawFO() {
  int mx= m%3;
  int my= int(m/3)%3;
  int mz= int(m/6)%3;
  for (int i= 0; i<col; i++) {
    int iCol= round(max_XPerCol*i);
    if ((mx==1&&i%2==0) || (mx==2&&i%2==1)) {
      x= mirrorX(x);
    }
    for (int j= 0; j<row; j++) {
      int jRow= round(max_YPerRow*j);
      if ((my==1&&j%2==0) || (my==2&&j%2==1)) {
        y= mirrorY(y);
      }
      for (int k= 0; k<depth; k++) {
        int kDepth= round(max_ZPerDepth*k);
        if ((mz==1&&k%2==0) || (mz==2&&k%2==1)) {
          z= mirrorZ(z);
        }
        point(x+iCol, y+jRow, z+kDepth);
      }
    }
  }
}
int mirrorX(int x) {
  return round(max_XPerCol-x);
}
int mirrorY(int y) {
  return round(max_YPerRow-y);
}
int mirrorZ(int z) {
  return round(max_ZPerDepth-z);
}