class Area { //PROPERTIES ArrayList elementList; //stores all free elements ArrayList fixedelementList; //stores all fixed elements Filter scaleFilter; //Area Properties float posX; //areas position float posY; float aWidth; //areas With float aHeight; //End Area Prop //CONSTRUCTORS Area ( ) { posX = -20; //negative value puts area outside applet window. posY = -20; aWidth = width+40; aHeight = height+40; scaleFilter = new Filter (this); elementList = new ArrayList( ); //build the new object of type ArrayList fixedelementList = new ArrayList( ); //build the new object of type ArrayList } //METHODS void scaleAllFacadeElements() { for ( int i=0; i < elementList.size(); i++) { FacadeElement cElement = (FacadeElement) elementList.get ( i ); float xpos = cElement.getX(); float ypos = cElement.getY(); //println(xpos); //println(xpos); float scaleFactor = scaleFilter.getValue(xpos,ypos); //float scaleFactor = scaleFilter.setFilterScale(xpos, ypos); float scaleSpeed = 0.05; float shrink = 1 -scaleSpeed; float grow = 1 +scaleSpeed; scaleFactor = map (scaleFactor, 0, 255, shrink, grow); // println(scaleFactor); if(!cElement.isFix()) cElement.setScale( scaleFactor); //scaleFilter.getValue(cElement.getX(), cElement.getY()) // float targetSize = 255/ scaleFactor; // float currentSize = } } void displayFilterImage () //displays the filter image transparent with some alpa adden { int iWidth = round (aWidth); int iHeight = round (aHeight); int iX = round (posX); int iY = round (posY); tint(255, 255, 255, 126); image( filterPic , iX, iY, iWidth, iHeight); } Filter getFilter (String filterName) { if (filterName.equals("SCALE")) { return scaleFilter; } else return null; } void checkAllElementIntersectAndMove () { for (int indexA = 0; indexA < elementList.size(); indexA++) { FacadeElement cE = (FacadeElement) elementList.get( indexA ); for (int indexB = indexA+1; indexB < elementList.size(); indexB++) { FacadeElement nE = (FacadeElement) elementList.get( indexB ); if ( cE.isIntersecting( nE ) ) { if(!cE.isFix()) cE.changeProportion(); //change proportion to cE if it's not a fixed element if(!nE.isFix()) nE.changeProportion(); //change proportion to nE if it's not a fixed element // elementList.remove( indexA ); float dX = nE.getX() -cE.getX(); float dY = nE.getY() -cE.getY(); if(!cE.isFix()) cE.addMovement( -dX/20.0, -dY/20.0 ); //add movement to cE if it's not a fixed element if(!nE.isFix()) nE.addMovement( dX/20.0, dY/20.0 ); //add movement to nE if it's not a fixed element if (cE.isOutsideArea()==true) { /* dX = dX*-1; dY = dY*-1; if(!cE.isFix()) cE.addMovement( -dX/20.0, -dY/20.0 ); //add movement to cE if it's not a fixed element if(!nE.isFix()) nE.addMovement( dX/20.0, dY/20.0 ); //add movement to nE if it's not a fixed element */ if (die==1) { elementList.remove( indexA ); } //if die=1 kills object if outside area } } } } } void executeMovementAllElements() { for (int i=0; i < elementList.size(); i++) { FacadeElement cE = (FacadeElement) elementList.get( i ); cE.executeMovement(); } } float getWidth () { return aWidth; } float getHeight () { return aHeight; } void createPatternElement (int helement,int velement, float eSpace) { float hSpace = aWidth / (float) helement; float vSpace = aHeight / (float) velement; float xoffset; float yoffset; xoffset = posX + hSpace/2.0; //giving initial coordinate to write rectangels yoffset = posY + vSpace/2.0; //giving initial coordinate to write rectangels // float eWidth = hSpace-eSpace; // float eHeight = vSpace-eSpace; float eWidth; float eHeight; if (hSpace>eSpace) { //setting the element width and cheking so that value is not 0 or negative. eWidth = hSpace-eSpace; } else { eWidth = 1; } //end setting width if (vSpace>eSpace) { //setting the element height and cheking so that value is not 0 or negative. eHeight = vSpace-eSpace; } else { eHeight = 1; } //end setting height for (int i=0; i< helement; i++) //drawing the rectangles { for (int k=0; k< velement; k++) { float x = xoffset+ i*hSpace; //counting the new x coordinate float y = yoffset+ k*vSpace; //counting the new y coordinate rectMode(CENTER); FacadeElement nFE = new FacadeElement(this); nFE.setSize (eWidth,eHeight); nFE.setPosition (x,y); nFE.setColor(); elementList.add (nFE); } } //end of Loop } //end of createPatternElement void createFixedElement () //creates fixed element if Facade eqv. window/opening. Put coordinates for openings here { /* FacadeElement nFE = new FacadeElement(this); nFE.setSize (100,30); //add interface later nFE.setPosition (200,100); //add interface later nFE.fix(); elementList.add (nFE); FacadeElement nFE1 = new FacadeElement(this); nFE1.setSize (30,100); //add interface later nFE1.setPosition (300,300); //add interface later nFE1.fix(); elementList.add (nFE1); */ } //end createFixedElement void displayArea() { stroke (255,0,0); rectMode(CORNER); fill (0); rect (posX, posY, aWidth, aHeight ); } void growAllGaps() { for ( int i=0; i < elementList.size(); i++) { FacadeElement cElement = (FacadeElement) elementList.get ( i ); cElement.growGap(); } } void shrinkAllGaps() { for ( int i=0; i < elementList.size(); i++) { FacadeElement cElement = (FacadeElement) elementList.get ( i ); cElement.shrinkGap(); } } void displayAllElement() { for ( int i=0; i < elementList.size(); i++) { FacadeElement cElement = (FacadeElement) elementList.get ( i ); cElement.display(); cElement.displayValue(); } } void displayUserInterface() { rectMode(CENTER); noStroke(); colorMode(GRAY); fill (28, 198); int midX = width/2; int midY = height/2; rect (midX, midY, 300, 255); PFont font1; fill (255); font1 = loadFont("HelveticaNeue-Light-24.vlw"); textFont(font1, 14); text("Drag Mouse to activate this display", midX-140, midY-100); text("Legend", midX-140, midY-80); text("Press 'i' to display background image", midX-120, midY-60); text("Press 's' to export a pdf snapshot", midX-120, midY-40); text("Press 'c'/'r' to change drawing method", midX-120, midY-20); text("Up/down, right/left adjusts (min/max-size)", midX-120, midY); text("G/g, grows/shrinks the decired element-gap.", midX-120, midY+20); text("D/d, allow elements outside area to die.", midX-120, midY+40); text ("Abstract: This application let's free elements move", midX-140, midY+60); text ("on a surface, following certain rules. Based on a mapped", midX-140, midY+75); text ("image they grow or shrink. Each element ", midX-140, midY+90); text ("tries to avoid the other. These contradicting rules", midX-140, midY+105); text ("generates a pattern", midX-140, midY+120); } //end display UI } // End