Construct2_3d
click to generate new pattern
See /f0blog/useless-supercollider-class-no-2/
//
// construct2_3d.js
//
// Copyright (c) 2003 Fredrik Olofsson Musikproduktion. All rights reserved.
//
// 2001 original code in java
// 010502 max patch (rev.011004)
// 040920 ported to processing
// 060227 3d version for processing
// 071201 ported to sc (RedConstruct)
// 200326 ported to p5js
//----------------------------------------------------------------------------------------------
let i, step_X, step_Y, step_Z;
let x= 10, y= 10, z= 10;
let dx= 1, dy= 1, dz= 1;
let v; //variant
let m; //mapping
let col, row, depth;
let mov_X= 95, mov_Y= 95, mov_Z= 95;
let max_XPerCol, max_YPerRow, max_ZPerDepth;
function setup() {
let d= new Date().getMilliseconds();
randomSeed(d);
let div= select('#sketch');
let cnv= createCanvas(div.width, div.height, WEBGL);
cnv.parent('sketch');
frameRate(60); //frameRate(25);
background(255);
nytt();
}
function mouseClicked() {
background(255);
nytt();
}
function keyTyped() {
if(key==' ') {
background(255); //rensa skärmen
nytt(); //nya värden
}
}
function 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;
}
}
//----------------------------------------------------------------------------------------------
function variant1() { //1. slumpa riktningar individuellt
if (random(100)>=mov_X) {
slumpaRiktningX();
}
if (random(100)>=mov_Y) {
slumpaRiktningY();
}
if (random(100)>=mov_Z) {
slumpaRiktningZ();
}
}
function variant2() { //2. slumpa alltid riktningar tillsammans
slumpaRiktningXYZ();
}
function variant3() { //3. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draVanster();
}
if (random(100)>=mov_Y) {
draUppat();
}
if (random(100)>=mov_Z) {
draHogre();
}
}
function variant4() { //4. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draHoger();
}
if (random(100)>=mov_Y) {
draUppat();
}
if (random(100)>=mov_Z) {
draHogre();
}
}
function variant5() { //5. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draVanster();
}
if (random(100)>=mov_Y) {
draNedat();
}
if (random(100)>=mov_Z) {
draHogre();
}
}
function variant6() { //6. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draHoger();
}
if (random(100)>=mov_Y) {
draNedat();
}
if (random(100)>=mov_Z) {
draHogre();
}
}
function variant7() { //7. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draVanster();
}
if (random(100)>=mov_Y) {
draUppat();
}
if (random(100)>=mov_Z) {
draLagre();
}
}
function variant8() { //8. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draHoger();
}
if (random(100)>=mov_Y) {
draUppat();
}
if (random(100)>=mov_Z) {
draLagre();
}
}
function variant9() { //9. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draVanster();
}
if (random(100)>=mov_Y) {
draNedat();
}
if (random(100)>=mov_Z) {
draLagre();
}
}
function variant10() { //10. slumpa riktningar individuellt
if (random(100)>=mov_X) {
draHoger();
}
if (random(100)>=mov_Y) {
draNedat();
}
if (random(100)>=mov_Z) {
draLagre();
}
}
//----------------------------------------------------------------------------------------------
function 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);
}
function slumpaRiktningX() {
dx= int(random(2));
}
function slumpaRiktningY() {
dy= int(random(2));
}
function slumpaRiktningZ() {
dz= int(random(2));
}
function 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));
}
}
function draVanster() {
if (dx==0&&x>=1) {
dx= -1;
} else {
dx= 0;
} //dra åt vänster
}
function draHoger() {
if (dx==0&&x<=max_XPerCol) {
dx= 1;
} else {
dx= 0;
} //dra åt höger
}
function draNedat() {
if (dy==0&&y<=max_YPerRow) {
dy= 1;
} else {
dy= 0;
} //dra nedåt
}
function draUppat() {
if (dy==0&&y>=1) {
dy= -1;
} else {
dy= 0;
} //dra uppåt
}
function draHogre() {
if (dz==0&&z>=1) {
dz= -1;
} else {
dz= 0;
} //dra högre
}
function draLagre() {
if (dz==0&&z<=max_ZPerDepth) {
dz= 1;
} else {
dz= 0;
} //dra lägre
}
//----------------------------------------------------------------------------------------------
function drawFO() {
let iCol, jRow, kDepth;
let mx= m%3;
let my= int(m/3)%3;
let mz= int(m/6)%3;
translate(-0.5*width, -0.5*height);
for (let i= 0; i<col; i++) {
iCol= round((max_XPerCol)*i);
if ((mx==1&&i%2==0) || (mx==2&&i%2==1)) {
x= mirrorX(x);
}
for (let j= 0; j<row; j++) {
jRow= round((max_YPerRow)*j);
if ((my==1&&j%2==0) || (my==2&&j%2==1)) {
y= mirrorY(y);
}
for (let k= 0; k<depth; k++) {
kDepth= round((max_ZPerDepth)*k);
if ((mz==1&&k%2==0) || (mz==2&&k%2==1)) {
z= mirrorZ(z);
}
push();
translate(x+iCol, y+jRow, z+kDepth);
box(0.1);
pop();
}
}
}
}
function mirrorX(x) {
return round((max_XPerCol)-x);
}
function mirrorY(y) {
return round((max_YPerRow)-y);
}
function mirrorZ(z) {
return round((max_ZPerDepth)-z);
}