//color ornas //vert ornas ArrayList tree; ArrayList trunk; ArrayList ornas; void keyPressed(){ reset(); } float mx = 200; void mouseDragged(){ mx = mouseX; } void mousePressed(){ mx = mouseX; } void reset(){ tree = new ArrayList(); trunk = new ArrayList(); ornas = new ArrayList(); for(int i = 0; i < 5; i++){ trunk.add(new TrunkRing()); } for(int i = 0; i < 30; i++){ tree.add(new TreeRing()); } for(int i = 0; i < 30; i++){ ornas.add(new Ornament()); } ornas.add(new Star()); } class Star extends Ornament { Star(){ color c = color(255,255,0); float y = 25; float x = 250; initOrna(x,y,c); } } class Ornament{ ArrayList ornas = new ArrayList(); Ornament(){ color c = color( random(125,255),random(125,255),random(125,255)); float y = random(80,400); float r = map(y,40,440,0,130); float x = 250+random(-r,r); initOrna(x,y,c); } void initOrna(float x, float y, color c){ for(int i = 0; i < 4; i++){ ornas.add(new OrnaRing(x,y,c)); } } void draw(){ for(Ring r : ornas){ r.move(); r.draw(); } } } void setup(){ frameRate(30); size(500,500); smooth(); reset(); } void draw(){ noFill(); strokeWeight(2); background(0); for(Ring r : trunk){ r.move(); r.draw(); } for(Ring r : tree){ r.move(); r.draw(); } for(Ornament o : ornas){ o.draw(); } } float OSIZE=12; class OrnaRing extends Ring{ float x,y; OrnaRing(float px, float py,color pc){ super(py-OSIZE,py+OSIZE, pc,px); x = px; y = py; } float getWidth(){ return OSIZE* cos((PI/2)*((p-y)/OSIZE))/2; // return 10; } } class TreeRing extends Ring{ TreeRing(){ super(40,400, color(0,255,0),250); } float getWidth(){ return map(p,MIN,MAX,1,66); } } class TrunkRing extends Ring{ TrunkRing(){ super(400,470, color(128,64,0),250); } float getWidth(){ return 10; } } abstract class Ring{ float p; float s; color c; float MIN,MAX; float x; Ring(float pMIN,float pMAX, color pc, float px){ MIN = pMIN; MAX = pMAX; p = random(MIN,MAX); c = pc; x = px; float range = abs(MAX-MIN)/40; s = random(-range,range); } abstract float getWidth(); void draw() { // println(p); stroke(c); float z = getWidth(); ellipse(x,p,z*4,z); } void move(){ p += s * map(mx-125,-125,125,-2,2); // println(s * map(mouseX-125,-125,125,-2,2)); if(p < MIN){ p = MIN; s = abs(s); } if(p > MAX){ p = MAX; s = -abs(s); } } }