Multiple Reactor Points
ArrayList<PVector> reactorList = new ArrayList<PVector>(); int maxPointCount = 20; int gridWidth = 30; int gridHeight = 30; float dist_x = 20; float dist_y = 20; float shapeWidth = 20; float shapeHeight = 20; int xOffset; int yOffset; float reactorScaler = .003; void setup() { size(800, 800); smooth(); } void draw() { background(255); xOffset = floor(width/2-(dist_x*gridWidth/2)); yOffset = floor(height/2-(dist_y*gridHeight/2)); PVector temp = new PVector(mouse_X(), mouse_Y()); reactorList.add(temp); if (reactorList.size() >= maxPointCount) { reactorList.remove(0); } pushMatrix(); //saves current position of the coordinate system translate(xOffset, yOffset);//translate grid to center noStroke(); fill(0); for (int i = 0; i<gridWidth; i++ ) { for (int j = 0; j<gridHeight; j++ ) { PVector myPos = new PVector(i*dist_x, j*dist_y); PVector cpt = closestPoint(myPos); float reactorDistance = dist(cpt.x, cpt.y, myPos.x, myPos.y); float scaler = reactorDistance*reactorScaler; ellipse(myPos.x, myPos.y, shapeWidth*scaler, shapeHeight*scaler); }; }; //drawReactors(); // unconment to see the trail of reactors created by mouse movement popMatrix(); } void drawReactors() { stroke(255, 0, 0); for (int i = 0; i <reactorList.size()-1; i++) { line(reactorList.get(i).x, reactorList.get(i).y, reactorList.get(i+1).x, reactorList.get(i+1).y); } } PVector closestPoint(PVector location) { PVector tempPoint = reactorList.get(0); float bestDistance = dist(tempPoint.x, tempPoint.y, location.x, location.y); for (int i = 0; i < reactorList.size(); i++) { float tempDistance = dist(reactorList.get(i).x, reactorList.get(i).y, location.x, location.y); if (tempDistance<bestDistance) { bestDistance = tempDistance; tempPoint = reactorList.get(i).get(); } } return tempPoint; } int mouse_X() { return (mouseX - xOffset); //correct positions matrix translations } int mouse_Y() { return (mouseY - xOffset); //correct positions matrix translations }