/** * Design Space Box Demo : * by Sivam Krish for DDA * * * please use the mouse, mouse scroll along with 'up','down', 'left' & 'right' keys to navigate in 3D * Press 'a' to display coordinate system * The pop up windows "Design Parameters" allows you to explore design space and performance space * Click toggle to move to peformance space * * Thanks to proscene for the 3D display and ControlP5 for the user interface * *. */ import controlP5.*; ControlP5 controlP5; import remixlab.proscene.*; MyScene scene; int myColorBackground = color(0,0,0); ControlWindow controlWindow; int disMode = 1; //1 for parameter space, 2 for performace, 3 performancesapce int showVolume = 0; int showArea = 0; int showAngle = 0; int showAll = 0; int axisItems = 5; int totalItems = axisItems*axisItems*axisItems; float wi = 15, br=30, hi =40; float biggestVolume = wi*br*hi; float biggestaddArea = wi*hi; float biggestAngle = 180.0* (atan(wi*axisItems/hi))/PI; public float widthMin = 0; public float widthMax = wi; public float breadthMin = 0; public float breadthMax = br; public float heightMin = 0; public float heightMax = hi; public float volumeMin = 0; public float volumeMax = biggestVolume; public float addareaMin = 0; public float addareaMax = biggestaddArea; public float angleMin = 0; public float angleMax = biggestAngle; int Screen_Size = 600; float sc = 0.40; //scalling void setup() { // sets up the pop-up screen size(Screen_Size, Screen_Size, P3D); scene = new MyScene(this); controlP5 = new ControlP5(this); controlP5.setAutoDraw(false); controlWindow = controlP5.addControlWindow("controlP5window",100,100,400,150); controlWindow.hideCoordinates(); controlWindow.setUpdateMode(ControlWindow.ECONOMIC); //activate only when on top controlWindow.setTitle("Design Parameters"); controlWindow.setBackground(color(40)); //buttons Controller myButtonPara = controlP5.addButton("parameter",10,0,0,78,20); Controller myButtonFilt = controlP5.addButton("filter",10,80,0,78,20); Controller myButtonPerf = controlP5.addButton("performance",10,160,0,78,20); myButtonPara.setColorForeground(0xffff0000); myButtonFilt.setColorForeground(0xffff0000); myButtonPerf.setColorForeground(0xffff0000); //sliders Controller myWidthRange = controlP5.addRange("width",0,wi,0,wi*0.7,70,50,200,12); Controller myBreadthRange = controlP5.addRange("breadth",0,br,0,br*0.6,70,70,200,12); Controller myHeightRange = controlP5.addRange("height",0,hi,0,hi*0.7,70,90,200,12); Controller myvolumeRange = controlP5.addRange("volume",0,biggestVolume,0,biggestVolume*0.6,70,50,200,12); Controller myaddAreaRange = controlP5.addRange("addArea",0,biggestaddArea,0,biggestaddArea*0.7,70,70,200,12); Controller myangleRange = controlP5.addRange("angle",0,biggestAngle,0,biggestAngle*0.6,70,90,200,12); Controller myVolume = controlP5.addButton("Volume",0,10,50,40,12); Controller myArea = controlP5.addButton("Area",0,10,70,40,12); Controller myAngle = controlP5.addButton("Angle",0,10,90,40,12); Controller myAll = controlP5.addButton("All",0,10,110,40,12); //asign to window myButtonPara.setWindow(controlWindow); myButtonFilt.setWindow(controlWindow); myButtonPerf.setWindow(controlWindow); myWidthRange.setWindow(controlWindow); myBreadthRange.setWindow(controlWindow); myHeightRange.setWindow(controlWindow); myvolumeRange.setWindow(controlWindow); myaddAreaRange.setWindow(controlWindow); myangleRange.setWindow(controlWindow); myVolume.setWindow(controlWindow); myArea.setWindow(controlWindow); myAngle.setWindow(controlWindow); myAll.setWindow(controlWindow); controlP5.draw(); } void draw() { if(disMode == 1 ){ controlP5.controller("volume").hide(); controlP5.controller("addArea").hide(); controlP5.controller("angle").hide(); controlP5.controller("Volume").hide(); controlP5.controller("Area").hide(); controlP5.controller("Angle").hide(); controlP5.controller("All").hide(); controlP5.controller("width").show(); controlP5.controller("breadth").show(); controlP5.controller("height").show(); } else { controlP5.controller("width").hide(); controlP5.controller("breadth").hide(); controlP5.controller("height").hide(); controlP5.controller("Volume").show(); controlP5.controller("Area").show(); controlP5.controller("Angle").show(); controlP5.controller("All").show(); if(showVolume ==1) { controlP5.controller("volume").show(); controlP5.controller("addArea").hide(); controlP5.controller("angle").hide(); } if(showArea ==1) { controlP5.controller("volume").hide(); controlP5.controller("addArea").show(); controlP5.controller("angle").hide(); } if(showAngle ==1) { controlP5.controller("volume").hide(); controlP5.controller("addArea").hide(); controlP5.controller("angle").show(); } if(showAll ==1) { controlP5.controller("volume").show(); controlP5.controller("addArea").show(); controlP5.controller("angle").show(); } } } class MyScene extends Scene { // We need to call super(p) to instantiate the base class public MyScene(PApplet p) { super(p); } // Initialization stuff could have also been performed at // setup(), once after the Scene object have been instantiated public void init() { setGridIsDrawn(false); setAxisIsDrawn(false); } //Define here what is actually going to be drawn. public void proscenium() { background(0); boolean xPass = false, yPass = false, zPass = false ; translate( -sc*Screen_Size/2,-sc*Screen_Size/2,sc*Screen_Size/2); Box[] myBoxes = new Box[totalItems + 1]; myBoxes[0] = new Box(0,0,hi); int n = 1; for (int z = 1; z <=axisItems; z ++) { for (int y = 1; y <= axisItems; y ++) { for (int x = 1; x <= axisItems; x ++) { myBoxes[n]= new Box(wi*x/axisItems,br*y/axisItems,hi*(1+axisItems-z)/axisItems); myBoxes[n].Setscale(1); xPass = false; yPass = false; zPass = false; { if(disMode == 1) { // driven by parameters fill(150,100); noStroke(); if( ( myBoxes[n].Getwidth() <= widthMax ) && ( myBoxes[n].Getwidth() >= widthMin ) ) {xPass = true; println("Xpass"); } if( ( myBoxes[n].Getbreadth()<= breadthMax) && ( myBoxes[n].Getbreadth() >= breadthMin) ) {yPass = true; println("Ypass");} if( ( myBoxes[n].Getheight() <= heightMax ) && ( myBoxes[n].Getheight() >= heightMin ) ) {zPass = true; println("Zpass");} if( xPass && yPass && zPass ) { fill(200, 102, 0); stroke(0); } } if(disMode == 2 | disMode ==3){ // driven by filters fill(150,100); noStroke(); if( ( floor(myBoxes[n].Getvolume()) <= volumeMax ) && ( ceil(myBoxes[n].Getvolume()) >= volumeMin ) ) {xPass = true; } if( ( floor(myBoxes[n].Getaddarea()) <= addareaMax) && ( ceil(myBoxes[n].Getaddarea()) >= addareaMin) ) {yPass = true; } if( ( floor(myBoxes[n].Getangle()) <= angleMax ) && ( ceil(myBoxes[n].Getangle()) >= angleMin ) ) {zPass = true; } if(showAll ==1){ fill(255*(myBoxes[n].Getvolume() /biggestVolume),255*(myBoxes[n].Getaddarea()/biggestaddArea),255*(myBoxes[n].Getangle()/biggestAngle), 150); noStroke(); } else { fill(255*showVolume*myBoxes[n].Getvolume()/biggestVolume,255*showArea*myBoxes[n].Getaddarea()/biggestaddArea,255*showAngle*myBoxes[n].Getaddarea()/biggestAngle, 150); noStroke(); } if( xPass && yPass && zPass ) { fill(200, 102, 0); stroke(0); } } if(disMode != 3) { translate(sc*Screen_Size/axisItems,0,0);} else { translate(sc*Screen_Size*(myBoxes[n].Getvolume()- myBoxes[n-1].Getvolume())/biggestVolume, sc*Screen_Size*(myBoxes[n].Getaddarea()- myBoxes[n-1].Getaddarea())/biggestaddArea, -sc*Screen_Size*(myBoxes[n].Getangle() -myBoxes[n-1].Getangle())/biggestAngle); } myBoxes[n].drawbox(); n ++; } } if(disMode != 3) { translate(- sc*Screen_Size,sc*Screen_Size/axisItems,0); } }if(disMode != 3) { translate(0,- sc*Screen_Size,- sc*Screen_Size/axisItems);} } PFont font; // The font must be located in the sketch's // "data" directory to load successfully font = loadFont("ArialNarrow-20.vlw"); textFont(font); fill(100,255); if (disMode != 3){ text("width", 180, 0); text("breadth", 0, 180); text("height", 0,0, 220); } else { text("voulme", 180, 0); text("area", 0, 180); text("angle", 0,0, 220); } } } void keyPressed() { if(key==',') controlP5.window("controlP5window").hide(); if(key=='.') controlP5.window("controlP5window").show(); } void controlEvent(ControlEvent theControlEvent) { if(theControlEvent.controller().name().equals("width")) { // min and max values are stored in an array. // access this array with controller().arrayValue(). // min is at index 0, max is at index 1. widthMin = int(theControlEvent.controller().arrayValue()[0]); widthMax = int(theControlEvent.controller().arrayValue()[1]); } if(theControlEvent.controller().name().equals("breadth")) { breadthMin = int(theControlEvent.controller().arrayValue()[0]); breadthMax = int(theControlEvent.controller().arrayValue()[1]); println("with is being changed"); } if(theControlEvent.controller().name().equals("height")) { heightMin = int(theControlEvent.controller().arrayValue()[0]); heightMax = int(theControlEvent.controller().arrayValue()[1]); } if(theControlEvent.controller().name().equals("volume")) { volumeMin = int(theControlEvent.controller().arrayValue()[0]); volumeMax = int(theControlEvent.controller().arrayValue()[1]); } if(theControlEvent.controller().name().equals("addArea")) { addareaMin = int(theControlEvent.controller().arrayValue()[0]); addareaMax = int(theControlEvent.controller().arrayValue()[1]); } if(theControlEvent.controller().name().equals("angle")) { angleMin = int(theControlEvent.controller().arrayValue()[0]); angleMax = int(theControlEvent.controller().arrayValue()[1]); } } public void parameter(float theValue) { controlWindow.setTitle("Design Space"); disMode = 1; controlP5.controller("parameter").setColorLabel(0xFFF8DC); controlP5.controller("filter").setColorLabel(0); controlP5.controller("performance").setColorLabel(0); } public void filter(float theValue) { controlWindow.setTitle("Filter Space"); disMode = 2; controlP5.controller("parameter").setColorLabel(0); controlP5.controller("filter").setColorLabel(0xFFF8DC); controlP5.controller("performance").setColorLabel(0); showAll = 1; } public void performance(float theValue) { controlWindow.setTitle("Performance Space"); disMode = 3; controlP5.controller("parameter").setColorLabel(0); controlP5.controller("filter").setColorLabel(0); controlP5.controller("performance").setColorLabel(0xFFF8DC); showAll = 1; } public void Volume(float theValue) { showVolume = 1; showArea = 0; showAngle = 0; showAll = 0; } public void Area(float theValue) { showVolume = 0; showArea = 1; showAngle = 0; showAll = 0; } public void Angle(float theValue) { showVolume = 0; showArea = 0; showAngle = 1; showAll = 0; } public void All(float theValue) { showVolume = 0; showArea = 0; showAngle = 0; showAll = 1; }