xxxxxxxxxx
ArrayList<Circle> c;
ArrayList<PVector> points;
PGraphics letter;
String l = "";
PImage p;
float s=400,max=0;
void setup(){
size(700,700);
letter = createGraphics(width, height);
createStuff();
}
void draw(){
background(0);
if(l.length()>0){
int total=5,count=0,attempts=0;
while(count<total){
Circle c1= newCircle();
if(c1!=null){
c.add(c1);
count++;
}
attempts++;
if(attempts>1000){
break;
}
}
float m=0;
for(Circle C: c){
if(C.r>m){
m=C.r;
}
}
for(Circle C: c){
if(C.growing){
if(C.r>max){
C.growing=false;
}
if(C.edges()){
C.growing=false;
}else{
for(Circle C1: c){
float d=dist(C.x,C.y,C1.x,C1.y);
if((d-2<C.r+C1.r) && C!=C1){
C.growing=false;
break;
}
}
}
}
C.grow();
C.show();
}
}
}
void keyPressed() {
if (key != CODED) { // Compute ASCII key input
switch(key) {
case BACKSPACE: case DELETE:
l = l.substring(0, max(0, l.length()-1));
break;
case ENTER:
l+="\n";
break;
default:
l += str(key);
}
}
createStuff();
}
void createStuff(){
letter.beginDraw();
letter.noStroke();
letter.background(0);
letter.fill(255);
letter.textSize(s);
if(letter.textWidth(l)>700){
for(int i=400;i>0;i--){
letter.textSize(i);
if(letter.textWidth(l)<650){
s=i;
break;
}
}
}else{
s=400;
}
max=s/25;
letter.textLeading((letter.textAscent()+letter.textDescent()));
letter.textAlign(CENTER,CENTER);
letter.text(l, width/2, height*.45);
letter.endDraw();
letter.loadPixels();
c=new ArrayList();
points=new ArrayList();
p=letter;
p.loadPixels();
for(int x=0;x<p.width;x++){
for(int y=0;y<p.height;y++){
int index=x+y*p.width;
color c1=p.pixels[index];
float b=brightness(c1);
if(b>1){
points.add(new PVector(x,y));
}
}
}
}
Circle newCircle(){
int r=int(random(0,points.size()));
float x=points.get(r).x;
float y=points.get(r).y;
boolean valid=true;
for(Circle C: c){
float d= dist(x,y,C.x,C.y);
if(d-2<C.r){
valid=false;
break;
}
}
if(valid){
return (new Circle(x,y));
}else{
return null;
}
}
class Circle{
float x,y,r;
boolean growing=true;
Circle(float X, float Y){
x=X;
y=Y;
r=0;
}
void grow(){
if(growing){
r+=1;
}
}
boolean edges(){
return (x+r+1>=width || x-r-1<=0 || y+r+1>=height || y-r-1<=0);
}
void show(){
stroke(255);
noFill();
ellipse(x,y,r*2,r*2);
}
}