...
Code Block |
---|
PShape basicShape;
int arrayWidth = 20;
int arrayHeight = 20;
float dist_x = 20;
float dist_y = 20;
float shapeWidth = 10;
float shapeHeight = 10;
int duration = 120;
int scaleTimer = 0;
float amplitude = 3;
float wavelength = 40;
int xOffset;
int yOffset;
PVector reactorPosition;
void setup() {
size(800, 700);
xOffset = floor(width/2-(dist_x*arrayWidth/2));
yOffset = floor(height/2-(dist_y*arrayHeight/2));
reactorPosition = new PVector(0, 0);
noStroke();
fill(0);
};
void draw() {
background(255);
scaleTimer+=3;
pushMatrix();
translate(xOffset, yOffset);
for (int i = 0; i<arrayWidth; i++ ) {
for (int j = 0; j<arrayHeight; j++ ) {
shapeMode(CENTER);
PVector myPos = new PVector(i*dist_x, j*dist_y);
float reactorDistance = dist(reactorPosition.x, reactorPosition.y, myPos.x, myPos.y);
int myStartTime = int(scaleTimer-reactorDistance);
float scaler = bellCurve(myStartTime, shapeWidth, amplitude, wavelength);
ellipse(myPos.x, myPos.y, scaler, scaler);
};
};
popMatrix();
};
int mouse_X() {
return (mouseX - xOffset); //correct positions matrix translations
}
int mouse_Y() {
return (mouseY - xOffset); //correct positions matrix translations
}
void mouseClicked() {
scaleTimer = -100;
reactorPosition.x = mouse_X();
reactorPosition.y = mouse_Y();
};
float bellCurve(float t, float a, float b, float c) {
// see https://en.wikipedia.org/wiki/Gaussian_function
// t = time
// a = start value
// b = amplitude
// c = wavelength
float scaler = 1+(c/sqrt((c*c)+(t*t)))*b; //bell curve
return scaler*a;
};
// alternative equation for easing
float easeInOutQuart (float t, float b, float c, float d) {
// seee http://www.robertpenner.com/easing/
// t = time
// b = start value
// c = change in value
// d = duration
if ((t/=d/2) < 1) return c/2*t*t + b;
return -c/2 * ((--t)*(t-2) - 1) + b;
}; |