A dynamically-generated bar chart. Move mouse to view dynamic pie chart.
int xspacing = 16; // How far apart should each horizontal location be spaced int w; // Width of entire wave int maxwaves = 4; // total # of waves to add together int total = 0; float theta = 0.0f; float[] amplitude = new float[maxwaves]; // Height of wave float[] dx = new float[maxwaves]; // Value for incrementing X, to be calculated as a function of period and xspacing float[] yvalues; // Using an array to store height values for the wave (not entirely necessary) float[] last; int pos; int rel; int numLines; int idealLines; int idealSpacing; int targetX; void setup() { size(600, 150); //frameRate(24); colorMode(RGB,255,255,255,100); //background(0); smooth(); w = width+16; for (int i = 0; i < maxwaves; i++) { amplitude[i] = random(20,30); float period = random(100,300); // How many pixels before the wave repeats dx[i] = (TWO_PI / period) * xspacing; } last = new float[maxwaves]; idealLines = numLines = int(w/xspacing); idealSpacing = xspacing; yvalues = new float[numLines]; } void draw() { pos = constrain(mouseX, 75, width-75); rel = 1 - ((pos - 75) / (width - 150)); //background(0); fill(0, 10 + ((1 - rel) * 100)); rect(0, 0, width, height); //numLines = idealLines + ((1 - rel) * idealLines); //xspacing = idealSpacing - (((1 - rel) * idealSpacing) / 2); calcWave(); renderWave(); renderChart(); } void calcWave() { // Increment theta (try different values for 'angular velocity' here theta += 0.02; // Set all height values to zero for (int i = 0; i < numLines; i++) { yvalues[i] = 0.0f; } total = 0; // Accumulate wave height values for (int j = 0; j < maxwaves; j++) { float x = theta; last[j] = 0; for (int i = 0; i < numLines; i++) { // Every other wave is cosine instead of sine int diff = j % 2 == 0 ? sin(x) : cos(x); int add = diff*amplitude[j]; last[j] += add; yvalues[i] += add; total += add; x+=dx[j]; // - (((1 - rel) * dx[j]) / 2); } } } void renderWave() { noStroke(); fill(254,60,0, 120 * rel); beginShape(); vertex(0,height); for (int x = 0; x < numLines; x++) { vertex(x*xspacing,height/2+yvalues[x]+-5); vertex((x*xspacing) + 10,height/2+yvalues[x]-5); } vertex(width,height); endShape(CLOSE); fill(255,0,0, 120 * rel); beginShape(); vertex(0,height); for (int x = 0; x < numLines; x++) { vertex(x*xspacing,height/2+yvalues[x]); vertex((x*xspacing) + 10,height/2+yvalues[x]); } vertex(width,height); endShape(CLOSE); //fill(255,0,0,255 - ((x/numLines)*200)); //rect(x*xspacing,height/2+yvalues[x],10,height*2); // - ((1-rel) * 4) for (int x = 0; x < numLines; x++) { fill(255,0,0,255 - ((x/numLines)*200)); rect(x*xspacing,height/2+yvalues[x],10,height*2); // - ((1-rel) * 4) } } void renderChart() { int h = 0; for (int i=0; i