Word[] myWords; int words = 0; int threshold = 15; int[][] weights; float g=-10.0; int display = 0; int show = 0; int hold = 0; int fontsize = 30; void setup() { size(400, 400); framerate(25); weights = new int[91][91]; String info[] = loadStrings("soup.txt"); for(int s = 0; s < info.length; s++){ int list[] = splitInts(info[s],','); int q = list[0]; int r = list[1]; weights[q][r] = list[2]; } myWords = new Word[100]; BFont fontA = loadFont("Futura-Bold.vlw.gz"); textFont(fontA, fontsize); for (int i = 0; i < words; i++){ myWords[i] = new Word(); myWords[i].id = i; myWords[i].lastmatch = i; myWords[i].x = random(100,300); myWords[i].y = random(100,300); myWords[i].vx = random(-3,3); myWords[i].vy = random(-3,3); myWords[i].firstletter = int(random(65,90)); myWords[i].lastletter = myWords[i].firstletter; myWords[i].wordlength = 0; myWords[i].word = "" + char(myWords[i].firstletter); } } void loop() { if(hold == 0){ background(0); } //fill(#cf0000); // text(words,40,40); for (int j = 0; j < words; j++){ for (int k = 0; k < words; k++){ if(j != k) { if(dist(myWords[j].getX(),myWords[j].getY(),myWords[k].getX(),myWords[k].getY()) < threshold){ if(weights[myWords[j].lastletter][myWords[k].firstletter] > 1000 && myWords[j].lastmatch != k){ myWords[j].addLetters(1,myWords[k].firstletter); myWords[j].lastmatch = k; } //if(weights[myWords[k].lastletter][myWords[j].firstletter] > 500 && myWords[k].lastmatch != j){ // myWords[k].addLetters(1,myWords[j].firstletter); // myWords[k].lastmatch = j; //} } } if(display == 1){ stroke(#303030); line(myWords[j].getX(),myWords[j].getY(),myWords[k].getX(),myWords[k].getY()); fill(#303030); //BFont fontA = loadFont("Futura-Bold.vlw.gz"); //textFont(fontA, 10); if(j > k){ text(weights[myWords[j].firstletter][myWords[k].lastletter], (myWords[j].getX()+myWords[k].getX())/2, (myWords[j].getY()+myWords[k].getY())/2); } //textFont(fontA, fontsize); } float vectorx = myWords[j].getForceX(k); float vectory = myWords[j].getForceY(k); myWords[j].addForce(vectorx,vectory,weights[myWords[j].lastletter][myWords[k].firstletter]); myWords[k].addForce(-vectorx,-vectory,weights[myWords[j].lastletter][myWords[k].firstletter]); /* if(dist(myWords[j].getX()+myWords[j].getLength(),myWords[j].getY(),myWords[k].getX()+myWords[k].getLength(),myWords[k].getY()) < threshold){ myWords[j].addLetters(1,myWords[k].lastletter); myWords[k].addLetters(1,myWords[j].lastletter); } if(dist(myWords[j].getX()+myWords[j].getLength(),myWords[j].getY(),myWords[k].getX(),myWords[k].getY()) < threshold){ myWords[j].addLetters(1,myWords[k].firstletter); myWords[k].addLetters(0,myWords[j].lastletter); } if(dist(myWords[j].getX(),myWords[j].getY(),myWords[k].getX()+myWords[k].getLength(),myWords[k].getY()) < threshold){ myWords[j].addLetters(0,myWords[k].lastletter); myWords[k].addLetters(1,myWords[j].firstletter); } */ } } for (int i = 0; i < words; i++){ if(hold == 0){ myWords[i].animate(); } } } class Word { float x; float y; float vx; float vy; float ax; float ay; int firstletter; int lastletter; int id; int lastmatch; int wordlength; String word; void animate() { //ax = ax / 5.0; //ay = ay / 5.0; vx = vx + ax; vy = vy + ay; /* if(vx > 3) { vx = 3; } if(vy > 3) { vy = 3; } */ // vx = vx / 2.0; //vy = vy / 2.0; x = x + vx; y = y + vy; if(x < 0){ x = 0; vx = -vx; } if(x > width){ x = width; vx = -vx; } if(y < 0){ y = 0; vy = -vy; } if(y > height){ y = height; vy = -vy; } drawWord(); vx = vx * 0.58; vy = vy * 0.58; ax = 0; ay = 0; } void drawWord() { ellipseMode(CENTER_RADIUS); //noStroke(); //lights(); noFill(); stroke(#cf0000); ellipse(x,y,threshold,threshold); //ellipse(x+(wordlength*3),y,threshold,threshold); fill(#ffff00); //textFont(fontA, 10); if(show == 1){ text(word,x-5,y+5); } else { text(char(firstletter),x-5,y+5); } } float getForceX(int o) { int m2 = weights[myWords[o].firstletter][lastletter]; int mass = weights[lastletter][myWords[o].firstletter]; float otherx = myWords[o].getX(); float othery = myWords[o].getY(); float diffx = x - otherx; float diffy = y - othery; float dist = hypo(diffx,diffy); if(dist < 10.0){ dist = 10.0; } //float force_magnitude = float(g*mass*m2)/(dist*dist); float force_magnitude = float(g*m2)/(dist*dist); float normx = diffx/float(dist); return force_magnitude * normx; } float getForceY(int o) { float m2 = weights[myWords[o].firstletter][lastletter]; float mass = weights[lastletter][myWords[o].firstletter]; float otherx = myWords[o].getX(); float othery = myWords[o].getY(); float diffx = x - otherx; float diffy = y - othery; float dist = hypo(diffx,diffy); if(dist < 10.0){ dist = 10.0; } //float force_magnitude = float(g*mass*m2)/(dist*dist); float force_magnitude = float(g*m2)/(dist*dist); float normy = diffy/float(dist); return force_magnitude * normy; } void addForce(float fx, float fy, float m){ //m = m / 10; if(m == 0.0){ m = 1.0; } //ax = ax + fx/float(m); //ay = ay + fy/float(m); ax = ax + fx/10; ay = ay + fy/10; } float getX(){ return x; } float getY(){ return y; } int getLength(){ return wordlength * 3; } void addLetters(int type, int newletters){ if(newletters != lastletter){ if(type == 0){ word = char(newletters) + word; firstletter = newletters; } else { word = word + char(newletters); } wordlength++; } } } float hypo(float sx, float sy) { sx = sx*sx; sy = sy*sy; return float(sqrt( float(sx) + float(sy) )); } void keyReleased(){ if(key == 32) { if(display == 0){ display = 1; } else { display = 0; background(0); } } if(key > 96 && key < 123) { int let = key - 32; myWords[words] = new Word(); myWords[words].id = words; myWords[words].lastmatch = words; myWords[words].x = random(100,300); myWords[words].y = random(100,300); myWords[words].vx = random(-3,3); myWords[words].vy = random(-3,3); myWords[words].firstletter = let; myWords[words].lastletter = myWords[words].firstletter; myWords[words].wordlength = 0; myWords[words].word = "" + char(myWords[words].firstletter); myWords[words].drawWord(); words++; } if(key == 61){ if(show == 0){ show = 1; } else { show = 0; background(0); } } if(key == 45) { if(hold == 0){ hold = 1; } else { hold = 0; } } }