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
}
, multiple selections available,
