Tuesday, June 01, 2010
honeycomb text editor
// a fork and splice of the previous
// sketches, working towards slub OS
// click on the hexagons to change the text
int frames;
int[] font = {12044, 13063, 15360, 13059, 15372, 11276, 15620, 3852, 12291,
5888, 3160, 7168, 4032, 3984, 16128, 11788, 16144, 11804,
12676, 8195, 7936, 3168, 3888, 240, 193, 12384, 16224, 832,
13836, 13060, 2828, 14604, 15628, 8257, 16140, 11020, 14607,
255, 15, 12, 96, 4108, 15360, 13056, 80, 160, 4096, 0
};
char[] alphabet = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', '$', '*', '+', '-', '/', '=', '[', ']',
'(', ')', '_', ' '
};
void drawLetter(char letter) {
int l = 0;
for (int n = 0; n < alphabet.length; ++n) {
if (alphabet[n] == letter) {
l = font[n];
}
}
for (int i = 0; i < 14; ++i) {
if((l & int(pow(2, 13-i))) != 0) {
switch(i) {
case 0: line(0, 0, 16, 0); break; // t
case 1: line(0, 20, 16, 20); break; // b
case 2: line(0, 0, 0, 10); break; // lt
case 3: line(0, 10, 0, 20); break; // lb
case 4: line(16, 0, 16, 10); break; // rt
case 5: line(16, 10, 16, 20); break; // rb
case 6: line(0, 0, 8, 10); break; // dtl
case 7: line(16, 0, 8, 10); break; // dtr
case 8: line(0, 20, 8, 10); break; // dbl
case 9: line(16, 20, 8, 10); break; // dbr
case 10: line(0, 10, 8, 10); break; // ml
case 11: line(8, 10, 16, 10); break; // mr
case 12: line(8, 0, 8, 10); break; // mt
case 13: line(8, 10, 8, 20); break; // mb
}
}
}
}
void draw_cell(int x,int y,float size,int col)
{
fill(col);
int sides=6;
beginShape();
for (int i=1; i<=sides; i++)
{
float a=(i/(float)sides)*2*PI;
vertex(x+size*sin(a),
y+size*cos(a));
}
endShape();
}
int mem_w=7, mem_h=5;
int[] make_memory()
{
int mem[] = new int[mem_w*mem_h];
int pat[] = new int[4];
pat[0]=18; pat[1]=11; pat[2]=20; pat[3]=1;
for (int i=0; i<mem.length; i++)
{
mem[i]=0;//pat[i%4];
}
return mem;
}
void poke(int[] mem, int x, int y, int v) { mem[mem_w*y+x]=v; }
int peek(int[] mem, int x, int y) { return mem[mem_w*y+x]; }
int[] honeycomb_pos(int x, int y)
{
int offset=0;
if (y%2==0) offset=28;
int[] r = new int[2];
r[0]= 50+x*57+offset;
r[1]= 50+y*50;
return r;
}
void draw_honeycomb(int[] mem, int w, int h)
{
for (int x=0; x<w; x++)
{
for (int y=0; y<h; y++)
{
int[] pos = honeycomb_pos(x,y);
draw_cell(pos[0],pos[1],
30,255);
pushMatrix();
translate(pos[0]-10,pos[1]-10);
scale(1);
drawLetter(alphabet[peek(mem,x,y) % alphabet.length]);
popMatrix();
}
}
}
void check_honeycomb(int[] mem, int mouseX, int mouseY)
{
for (int x=0; x<mem_w; x++)
{
for (int y=0; y<mem_h; y++)
{
int[] pos = honeycomb_pos(x,y);
if (abs(mouseX-pos[0])<20 &&
abs(mouseY-pos[1])<20)
{
poke(mem,x,y,peek(mem,x,y)+1);
}
}
}
}
void clear()
{
fill(255);
stroke(255);
rect(0,0,800,300);
fill(0);
stroke(0);
}
int[] mem = make_memory();
void setup()
{
background(255);
size(500,300);
draw_honeycomb(mem,mem_w,mem_h);
}
void draw()
{
if (mousePressed)
{
check_honeycomb(mem,mouseX, mouseY);
clear();
draw_honeycomb(mem,mem_w,mem_h);
}
}
// sketches, working towards slub OS
// click on the hexagons to change the text
int frames;
int[] font = {12044, 13063, 15360, 13059, 15372, 11276, 15620, 3852, 12291,
5888, 3160, 7168, 4032, 3984, 16128, 11788, 16144, 11804,
12676, 8195, 7936, 3168, 3888, 240, 193, 12384, 16224, 832,
13836, 13060, 2828, 14604, 15628, 8257, 16140, 11020, 14607,
255, 15, 12, 96, 4108, 15360, 13056, 80, 160, 4096, 0
};
char[] alphabet = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', '$', '*', '+', '-', '/', '=', '[', ']',
'(', ')', '_', ' '
};
void drawLetter(char letter) {
int l = 0;
for (int n = 0; n < alphabet.length; ++n) {
if (alphabet[n] == letter) {
l = font[n];
}
}
for (int i = 0; i < 14; ++i) {
if((l & int(pow(2, 13-i))) != 0) {
switch(i) {
case 0: line(0, 0, 16, 0); break; // t
case 1: line(0, 20, 16, 20); break; // b
case 2: line(0, 0, 0, 10); break; // lt
case 3: line(0, 10, 0, 20); break; // lb
case 4: line(16, 0, 16, 10); break; // rt
case 5: line(16, 10, 16, 20); break; // rb
case 6: line(0, 0, 8, 10); break; // dtl
case 7: line(16, 0, 8, 10); break; // dtr
case 8: line(0, 20, 8, 10); break; // dbl
case 9: line(16, 20, 8, 10); break; // dbr
case 10: line(0, 10, 8, 10); break; // ml
case 11: line(8, 10, 16, 10); break; // mr
case 12: line(8, 0, 8, 10); break; // mt
case 13: line(8, 10, 8, 20); break; // mb
}
}
}
}
void draw_cell(int x,int y,float size,int col)
{
fill(col);
int sides=6;
beginShape();
for (int i=1; i<=sides; i++)
{
float a=(i/(float)sides)*2*PI;
vertex(x+size*sin(a),
y+size*cos(a));
}
endShape();
}
int mem_w=7, mem_h=5;
int[] make_memory()
{
int mem[] = new int[mem_w*mem_h];
int pat[] = new int[4];
pat[0]=18; pat[1]=11; pat[2]=20; pat[3]=1;
for (int i=0; i<mem.length; i++)
{
mem[i]=0;//pat[i%4];
}
return mem;
}
void poke(int[] mem, int x, int y, int v) { mem[mem_w*y+x]=v; }
int peek(int[] mem, int x, int y) { return mem[mem_w*y+x]; }
int[] honeycomb_pos(int x, int y)
{
int offset=0;
if (y%2==0) offset=28;
int[] r = new int[2];
r[0]= 50+x*57+offset;
r[1]= 50+y*50;
return r;
}
void draw_honeycomb(int[] mem, int w, int h)
{
for (int x=0; x<w; x++)
{
for (int y=0; y<h; y++)
{
int[] pos = honeycomb_pos(x,y);
draw_cell(pos[0],pos[1],
30,255);
pushMatrix();
translate(pos[0]-10,pos[1]-10);
scale(1);
drawLetter(alphabet[peek(mem,x,y) % alphabet.length]);
popMatrix();
}
}
}
void check_honeycomb(int[] mem, int mouseX, int mouseY)
{
for (int x=0; x<mem_w; x++)
{
for (int y=0; y<mem_h; y++)
{
int[] pos = honeycomb_pos(x,y);
if (abs(mouseX-pos[0])<20 &&
abs(mouseY-pos[1])<20)
{
poke(mem,x,y,peek(mem,x,y)+1);
}
}
}
}
void clear()
{
fill(255);
stroke(255);
rect(0,0,800,300);
fill(0);
stroke(0);
}
int[] mem = make_memory();
void setup()
{
background(255);
size(500,300);
draw_honeycomb(mem,mem_w,mem_h);
}
void draw()
{
if (mousePressed)
{
check_honeycomb(mem,mouseX, mouseY);
clear();
draw_honeycomb(mem,mem_w,mem_h);
}
}