/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.nSZnmrvMorx/rev.270
*
* authors:
* Matt Perkins
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
// This sketch builds on a prior work, "metalgrass", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9PVX9Xa43Dpq9/rev.1510
// This sketch builds on a prior work, "ffil", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9DDvwNnc1V0ym/rev.306
// This sketch features a little interactivity to switch
// between rectangles and ellipses
// This sketch builds on a prior work, "focus minus minus", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.93QIjB0iv4-e8/rev.5995
// This sketch builds on a prior work, "walking songs discretization mode your mom", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.98lTGFWhlh2uY/rev.379
// This sketch builds on a prior work, "walking songs micro 10", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9PRHItsoDswkz/rev.1
// This sketch builds on a prior work, "walking songs macro 5475", created by Matt Perkins
// http://studio.sketchpad.cc/sp/pad/view/ro.9UUCOcOswLbyj/rev.539
// with this one, we'll lock down the step and foot sizes.
// Pressing Control-R will render this sketch.
int FOOTSIZE = 28;
int STEP = 32;
int FOOTWIDTH = 5;
int FOOTHEIGHT = 6;
int i = 0;
PVector[] locations;
int lastLetterIndex=0;
HashMap letters;
string[] textArray;
int MAX_X_CONSTRAINT = 1000;
void setup() { // this is run once.
String g = getText();
textArray = g.split();
locations = new PVector[textArray.length];
for (int j=0; j<locations.length;j++)
{
int xoffset = (j * (FOOTWIDTH + 1) * STEP) + 50;
locations[j] = new PVector(xoffset, STEP+25);
}
letters = InitLetters();
// set the background color
background(255);
// canvas size (Variable aren't evaluated. Integers only, please.)
size(1000, 300);
// smooth edges
smooth();
// limit the number of frames per second
frameRate(30);
// set the width of the line.
strokeWeight(1);
fill(255,255,255,0);
cursor(TEXT);
}
void draw() { // this is run repeatedly.
for(int j=0; j< locations.length; j++)
{
drawMass(
color(random(255), 0, random(255), 15),
locations[j],
textArray[j]);
}
// move over a pixel
if (i < 50) {
i++;
} else {
i = 0;
}
}
void keyPressed() {
for(int j=1;j<textArray.length;j++)
{
textArray[j-1] = textArray[j];
}
textArray[textArray.length-1] = new String(key);
background(255);
}
void drawMass(color c, PVector v, String letter)
{
int[] bits;
if (letters.containsKey(letter.toLowerCase())) {
bits = (int[]) letters.get(letter.toLowerCase());
} else {
bits = GetBits('0')
}
for(int k=0;k<FOOTHEIGHT;k++)
{
for(int l=0; l<FOOTWIDTH ;l++)
{
if (bits[k*FOOTWIDTH + l] == 1)
{
stroke(c);
fill(c);
for(q=0;q<22;q++)
{
int locx = v.x + (l * STEP);
int locy = v.y + (k * STEP);
int startx = random(locx, locx + FOOTSIZE)
+ random(-FOOTSIZE,FOOTSIZE);
int starty = random(locy, locy + FOOTSIZE)
+ random(-FOOTSIZE,FOOTSIZE);
int endx = random(locx, locx + FOOTSIZE)
+ random(-FOOTSIZE,FOOTSIZE);
int endy = random(locy, locy + FOOTSIZE)
+ random(-FOOTSIZE,FOOTSIZE);
line(startx,
starty,
endx,
endy);
}
}
}
}
}
string nextLetter()
{
string next = textArray[lastLetterIndex];
lastLetterIndex++;
if (lastLetterIndex >= textArray.length)
lastLetterIndex = 0;
return next;
}
int getWholeRandom(min, max)
{
return int(random(min-1,max+1));
}
HashMap InitLetters()
{
HashMap l = new HashMap();
l.put("a", GetBits('a'));
l.put("b", GetBits('b'));
l.put("c", GetBits('c'));
l.put("d", GetBits('d'));
l.put("e", GetBits('e'));
l.put("f", GetBits('f'));
l.put("g", GetBits('g'));
l.put("h", GetBits('h'));
l.put("i", GetBits('i'));
l.put("j", GetBits('j'));
l.put("k", GetBits('k'));
l.put("l", GetBits('l'));
l.put("m", GetBits('m'));
l.put("n", GetBits('n'));
l.put("o", GetBits('o'));
l.put("p", GetBits('p'));
l.put("q", GetBits('q'));
l.put("r", GetBits('r'));
l.put("s", GetBits('s'));
l.put("t", GetBits('t'));
l.put("u", GetBits('u'));
l.put("v", GetBits('v'));
l.put("w", GetBits('w'));
l.put("x", GetBits('x'));
l.put("y", GetBits('y'));
l.put("z", GetBits('z'));
l.put(" ", GetBits(' '));
l.put(",", GetBits(','));
l.put(".", GetBits('.'));
l.put("?", GetBits('?'));
l.put("'", GetBits('\''));
l.put("-", GetBits('-'));
l.put("(", GetBits('('));
l.put(")", GetBits(')'));
l.put("2", GetBits('2'));
l.put("4", GetBits('4'));
return l;
}
int[] GetBits(char c)
{
string s = "";
switch (c) {
case ' ':
s = "0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0";
break;
case ',':
s = "0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,1,0,0,0," +
"1,0,0,0,0";
break;
case '.':
s = "0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"1,1,0,0,0," +
"1,1,0,0,0";
break;
case '?':
s = "0,1,1,1,0," +
"1,0,0,0,1," +
"0,0,0,1,0," +
"0,0,1,0,0," +
"0,0,0,0,0," +
"0,0,1,0,0";
break;
case '\'':
s = "0,1,0,0,0," +
"0,1,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0";
break;
case '-':
s = "0,0,0,0,0," +
"0,0,0,0,0," +
"0,0,0,0,0," +
"1,1,1,1,1," +
"0,0,0,0,0," +
"0,0,0,0,0";
break;
case '(':
s = "0,1,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"0,1,0,0,0";
break;
case ')':
s = "0,1,0,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,1,0,0,0";
break;
case 'A':
case 'a':
s = "0,0,1,0,0," +
"0,1,0,1,0," +
"1,0,0,0,1," +
"1,1,1,1,1," +
"1,0,0,0,1," +
"1,0,0,0,1";
break;
case 'B':
case 'b':
s = "1,1,1,1,0," +
"1,0,0,0,1," +
"1,1,1,1,0," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,1,1,1,0";
break;
case 'C':
case 'c':
s = "0,1,1,1,0," +
"1,0,0,0,1," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,1," +
"0,1,1,1,0";
break;
case 'D':
case 'd':
s = "1,1,1,1,0," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,1,1,1,0";
break;
case 'E':
case 'e':
s = "1,1,1,1,1," +
"1,0,0,0,0," +
"1,1,1,1,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,1,1,1,1";
break;
case 'F':
case 'f':
s = "1,1,1,1,1," +
"1,0,0,0,0," +
"1,1,1,1,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0";
break;
case 'G':
case 'g':
s = "0,1,1,1,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,1,1," +
"1,0,0,0,1," +
"0,1,1,1,0";
break;
case 'H':
case 'h':
s = "1,0,0,0,1," +
"1,0,0,0,1," +
"1,1,1,1,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1";
break;
case 'I':
case 'i':
s = "1,1,1,1,1," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"1,1,1,1,1";
break;
case 'J':
case 'j':
s = "0,0,0,0,1," +
"0,0,0,0,1," +
"0,0,0,0,1," +
"0,0,0,0,1," +
"1,0,0,0,1," +
"0,1,1,1,0";
break;
case 'K':
case 'k':
s = "1,0,0,0,1," +
"1,0,0,1,0," +
"1,0,1,0,0," +
"1,1,1,0,0," +
"1,0,0,1,0," +
"1,0,0,0,1";
break;
case 'l':
case 'L':
s = "1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,1,1,1,1";
break;
case 'M':
case 'm':
s = "1,0,0,0,1," +
"1,1,0,1,1," +
"1,0,1,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1";
break;
case 'N':
case 'n':
s = "1,0,0,0,1," +
"1,1,0,0,1," +
"1,0,1,0,1," +
"1,0,0,1,1," +
"1,0,0,0,1," +
"1,0,0,0,1";
break;
case 'O':
case 'o':
s = "0,1,1,1,0," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"0,1,1,1,0";
break;
case 'P':
case 'p':
s = "1,1,1,1,0," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,1,1,1,0," +
"1,0,0,0,0," +
"1,0,0,0,0," +
"1,0,0,0,0";
break;
case 'Q':
case 'q':
s = "0,1,1,1,0," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"0,1,1,1,1," +
"0,0,0,1,0";
break;
case 'R':
case 'r':
s = "1,1,1,1,0," +
"1,0,0,0,1," +
"1,1,1,1,0," +
"1,0,1,0,0," +
"1,0,0,1,0," +
"1,0,0,0,1";
break;
case 'S':
case 's':
s = "0,1,1,1,0," +
"1,0,0,0,1," +
"0,1,1,0,0," +
"0,0,1,1,0," +
"1,0,0,0,1," +
"0,1,1,1,0";
break;
case 'T':
case 't':
s = "1,1,1,1,1," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0";
break;
case 'U':
case 'u':
s = "1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"0,1,1,1,0";
break;
case 'V':
case 'v':
s = "1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"0,1,0,1,0," +
"0,0,1,0,0";
break;
case 'W':
case 'w':
s = "1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,1,0,1," +
"1,1,0,1,1," +
"1,0,0,0,1";
break;
case 'X':
case 'x':
s = "1,0,0,0,1," +
"0,1,0,1,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,1,0,1,0," +
"1,0,0,0,1";
break;
case 'Y':
case 'y':
s = "1,0,0,0,1," +
"1,0,0,0,1," +
"0,1,0,1,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,0,1,0,0";
break;
case 'Z':
case 'z':
s = "1,1,1,1,1," +
"0,0,0,1,0," +
"0,0,1,0,0," +
"0,0,1,0,0," +
"0,1,0,0,0," +
"1,1,1,1,1";
break;
case '2':
s = "0,1,1,1,0," +
"1,0,0,0,1," +
"0,0,0,1,0," +
"0,0,1,0,0," +
"0,1,0,0,0," +
"1,1,1,1,1";
break;
case '4':
s = "1,0,0,0,1," +
"1,0,0,0,1," +
"1,0,0,0,1," +
"1,1,1,1,1," +
"0,0,0,0,1," +
"0,0,0,0,1";
break;
default:
s = "1,1,1,1,1," +
"1,1,1,1,1," +
"1,1,1,1,1," +
"1,1,1,1,1," +
"1,1,1,1,1," +
"1,1,1,1,1";
break;
}
String[] bitletters = new String[FOOTWIDTH * FOOTHEIGHT];
bitletters = split(s, ",");
int[] bitnumbers = new int[FOOTWIDTH * FOOTHEIGHT];
for(int j=0; j<bitnumbers.length;j++)
{
if (bitletters[j] == "0")
{
bitnumbers[j] = 0;
}
else
{
bitnumbers[j] = 1;
}
}
return bitnumbers;
}
string getText()
{
return "METAL";
}
String[] getTextAsArray()
{
String t = getText();
String[] ts = split(t);
return ts
}