size(800, totalAnswers*answerHeight);
centerY = answerHeight/2;
answers = new Answer[totalAnswers];
for(int answer = 0; answer < totalAnswers; answer++){
answers[answer] = new Answer();
for(int answer = 0; answer < totalAnswers; answer++){
translate(0, answer*answerHeight-answer);
extreme1 = new Extreme();
extreme2 = new Extreme();
ballance = new Ballance();
extreme1.setup(centerX-centerX/2, centerY);
extreme2.setup(centerX+centerX/2, centerY);
rect(0, 0, width-1, answerHeight-1);
float abism = (extreme2.pos.x-extreme1.pos.x);
ballance.update(extreme1.pos.x+abism/2);
for(int x = extreme1.pos.x; x < extreme2.pos.x; x+=5){
float percent = (x-extreme1.pos.x)/abism;
float y = centerY + amplitude * (cardiogram(percent, extreme1.pulse) + cardiogram(percent, 1-extreme2.pulse));
if(prevX!=0) line(prevX, prevY, x, y);
extreme1.draw(cardiogram(0.0, extreme1.pulse) + cardiogram(0.0, 1-extreme2.pulse));
extreme2.draw(cardiogram(1.0, extreme1.pulse) + cardiogram(1.0, 1-extreme2.pulse));
float percent = (ballance.pos.x-extreme1.pos.x)/abism;
ballance.draw(cardiogram(percent, extreme1.pulse) + cardiogram(percent, 1-extreme2.pulse));
float cardiogram(float percent, float time){
float d = pow((1-abs(percent-(time-0.2)*2)), 5);
return sin(percent*TWO_PI*10.+frameCount/5)*d;
int lastFrameChangeTime = 0;
float delay = random(5, 30);
void setup(float x, float y) {
origin = new PVector(x, y);
if(frameCount - lastFrameChangeTime > changeTime+delay){
lastFrameChangeTime = frameCount;
while(abs(goX-prevGoX)<30) goX = random(-100, 100);
pulse = (frameCount - lastFrameChangeTime) / changeTime;
pos.x += ((origin.x+goX) - pos.x) * 0.09;
ellipse(pos.x, pos.y+y*amplitude, 10, 10);
pos = new PVector(centerX, centerY);
pos.x += (x - pos.x) * 0.05;
float y = pos.y+y*amplitude;