PFont f; XMLElement xml; int border= 60; int W = 740 + 2*border; int H = 400; String[] years; String[] democrats ; String[] republicans; int wid; int L; color r = color(200, 0, 100); color d = color(0, 0, 255); void setup() { size(W, H + 2*border); smooth(); f = loadFont("SansSerif-48.vlw"); xml = new XMLElement(this, "http://www.thevioletpiece.com/data/projects/congress/congress.xml"); XMLElement[] congresses = xml.getChildren("congress"); L = congresses.length; years = new String[L]; democrats= new String[L]; republicans = new String[L]; for(int i = 0; i < L; i++) { years[i] = congresses[i].getChild("year").getContent(); democrats[i] = congresses[i].getChild("democrats").getContent(); republicans[i] = congresses[i].getChild("republicans").getContent(); } wid = 740/congresses.length; } void draw(){ textAlign(LEFT); textFont(f,16); background(0); fill(50); rect( border, 30, 360, 15); fill(200, 0, 100); text("Lincoln Era", border+100, 43); fill(150); rect( 360 + border, 30, 240, 15); fill(0, 0, 250); text("Roosevelt Era", border+425, 43); fill(50); rect( 600 + border, 30, 142, 15); fill(200, 0, 100); text("Reagan Era", border+625, 43); fill(200, 0, 100); rect( border, H+border, 740, -H); setGradient(27, border, 15, 400, r, d); fill(255); text("% D", 19, 56); for(int i=0; iwid*(i) +border && mouseX < wid*(i+1) + border) { fill(255); rect(wid*(i) + border, border, 1, 400); rect(wid*(i+1) + border, border, 1, 400); textAlign(LEFT); textFont(f,20); text( years[i] + "\nD: " +democrats[i] + "\nR: " + republicans[i], mouseX+25, mouseY+40); } } } void setGradient(int x, int y, float w, float h, color c1, color c2 ){ // calculate differences between color components float deltaR = red(c2)-red(c1); float deltaG = green(c2)-green(c1); float deltaB = blue(c2)-blue(c1); for (int i=x; i<=(x+w); i++){ // row for (int j = y; j<=(y+h); j++){ color c = color( (red(c1)+(j-y)*(deltaR/h)), (green(c1)+(j-y)*(deltaG/h)), (blue(c1)+(j-y)*(deltaB/h)) ); set(i, j, c); } } }