```/*------------------------------------------------------------
Copyright (c) 2013, Friends of Ed (An Apress Company)
`The code provided here accompanies the book:`
```Processing: Creative Coding and Generative Art in Processing 2
By Ira Greenberg, Dianna Xu, and Deepak Kumar
Friends of Ed (An APress Company), 2013
ISBN-13 978-1430244646
------------------------------------------------------------*/```
```// Sketch 7-11: Word Cloud Visualization
// Sketch 7-11: The Word frequency table class```
```class WordFreq {
// A Frequency table class for Words
ArrayList<WordTile> wordFrequency;

WordFreq(String[] tokens) { // Constructor```
` wordFrequency = new ArrayList();`
``` // Compute the wordFrequency table using tokens
for (String t : tokens) {
if (!_isStopWord(t, stopWords)) {
// See if token t is already a known word
int index = _search(t, wordFrequency);
if (index >= 0) {
( wordFrequency.get(index)).incr();
}
else {
}
}
} // for
// Sort the table in reverse order of frequencies
_sort(wordFrequency);
//Collections.sort(wordFrequency, Collections.reverseOrder());
} // WordFreq()```
``` void tabulate(int n) { // console printout
//int n = wordFrequency.size();
println("There are "+N()+" entries.");
for (int i=0; i < n; i++) {
println(wordFrequency.get(i));
}
} // tabulate```
``` void arrange(int N) { // arrange or map the first N tiles in sketch
WordTile tile;
for (int i=0; i < N; i++) {
tile = wordFrequency.get(i);
tile.setFontSize();```
``` // Exploring the spiral layout
float cx = width/2-50, cy = height/2, px, py;
float R = 0.0, dR = 0.2, theta = 0.0, dTheta = 0.5;
do { // find the next x, y for tile, i in spiral
float x = cx + R*cos(theta);
float y = cy + R*sin(theta);
tile.setXY(x, y);
px = x;
py = y;
theta+=dTheta;
R += dR;
} // until the tile is clear of all other tiles
while (!clear (i));
}
} // arrange()```
``` boolean clear(int n) { // Is tile, i clear of tiles 0..i-1?
WordTile tile1 = wordFrequency.get(n);
for (int i=0; i < n; i++) {
WordTile tile2 = wordFrequency.get(i);
if (tile1.intersect(tile2)) {
return false;
}
} // for
return true;
} // clear()```
``` void display(int N) {
for (int i=0; i < N; i++) {
WordTile tile = wordFrequency.get(i);
tile.display();
}
} // display()```
``` void interact(float mx, float my) {
// Find out which tile was clicked
WordTile tile = _searchTile(wordFrequency, mx, my);```
```
// Do something on it
if (tile != null) {
println("Tile Clicked: "+tile);
tile.setColor(color(255, 0, 0));
tile.display();
}
} // interact()```
``` int N() { // Number of table entries
return wordFrequency.size();
} // N()```
``` String[] samples() { // Returns all the words
String [] k = new String[N()];
int i=0;
for (Word w : wordFrequency) {
k[i++] = w.getWord();
}
return k;
} // keys()```
``` int[] counts() { // Returns all the frequencies
int [] v = new int[N()];
int i=0;
for (Word w : wordFrequency) {
v[i++] = w.getFreq();
}
return v;
} // values()```
``` int maxFreq() { // The max frequency
return max(counts());
} // maxFreq()```
``` int _search(String w, ArrayList<WordTile> L) {
// Search for word, w in L
for (int i=0; i < L.size(); i++) {
if (L.get(i).getWord().equals(w))
return i;
}
return -1;
} // search()```
` WordTile _searchTile(ArrayList<WordTile> L, float mx, float my) {`
``` for (int i=0; i < L.size(); i++) {
WordTile tile = L.get(i);
if (ptInTile(tile, mx, my)) {
return(tile);
}
}
return null;
} // _searchTile()```
``` boolean ptInTile(WordTile t, float x, float y) {
float x1 = t.location.x;
float y1 = t.location.y - t.tileH;
float x2 = x1+t.tileW;
float y2 = t.location.y;```
``` return ((x >= x1 && x <= x2) && (y >= y1 && y <= y2));
} // ptInTile()

boolean _isStopWord(String word, String[] stopWords) {
for (String stopWord : stopWords) {
if (word.equals(stopWord)) {
return true;
}
}
return false;
} // isStopWord()```
``` void _sort(ArrayList<WordTile> A) { // sort the array A in ascending order
// for i=1 through N-1:
for (int i=0; i < A.size(); i++) {
// insert A[i] in A[0] .. A[i] such that A[0] <= A[1] <= … <= A[i]
WordTile a = A.get(i); // Save A[i] in p
int pos = i;
//while ( (pos > 0) && (A.get(pos-1).getFreq() < a.getFreq())) {
while ( (pos > 0) && (a.compareTo(A.get(pos-1))>0)) {
// Move A[pos-1] back by 1
A.set(pos, A.get(pos-1));
pos--;
} // while
// A[pos] is where a gets inserted
A.set(pos, a);
}// for
} // _sort```
``` String toString() { // Print representation
return "Word Frequency Table with"+N()+" entries.";
} // toString()
} // class WordFreq
```