Apologies for the noise, but I can’t help but plug Processing again in this context.
My first ever program was this:
size(400,400); stroke(225); strokeWeight(3);
line(100,200,300,200);
//line(100,100,300,300);
//line(300,100,100,300);
line(200,300,200,100);
fill(35,150,25,25);
ellipse(200,200,50,50);
ellipse(200,200,75,75);
ellipse(200,200,100,100);
ellipse(200,200,125,125);
ellipse(200,200,150,150);
ellipse(200,200,200,200);
ellipse(200,200,250,250);
ellipse(200,200,300,300);
ellipse(200,200,350,350);
ellipse(200,200,400,400);
fill(25, 185); noStroke();
ellipse(350,300,15,3);
ellipse(350,300,3,25);
ellipse(120,270,20,5);
ellipse(120,270,5,30);
I didn’t yet know about loops, or scope, or functions, or strings, or really anything. That was literally made on my very first day of programming. All of those functions I used were on a printed piece of paper for reference. I just kept typing ellipse(...)
and more circles appeared on the screen!
Knowing a decent bit of math by that age (20-ish) it was easy to make more complicated sketches by the end of week, once I looked up how to loop (I remember thinking after all that copy-paste “There’s got to be a better way!” – there was).
Later that week
size(600, 600);
background(140,20,50);
noStroke();
int max = 400;
float inc = 11;
float cx = width/2;
float cy = height/2;
for (float i =0; i<max; i=i+inc){
float r = max-i;
float col = pow(-1,r);
fill(45,160+(col*150),160,70);
pushMatrix();
translate(cx,cy);
rotate(radians(i));
ellipse(0,0,275,width-50);
popMatrix();
}
for (float i =0; i<max; i=i+inc){
float r = max-i;
float col = pow(-1,r);
fill(155,20,30+(col*50),130);
pushMatrix();
translate(cx,cy);
rotate(radians(i));
ellipse(0,0,30,275);
popMatrix();
}
noFill();
stroke(200);
ellipse(cx,cy,275,275);
ellipse(cx,cy,width-50,width-50);
A couple of weeks in, I had been making a few animations and interactive sketches as well:
FloatList x1 = new FloatList();
FloatList y1 = new FloatList();
void setup() {
size(1200, 720);
smooth();
strokeWeight(5);
stroke(0, 60);
frameRate(60);
for (int i=1; i<12000; i++) {
float r = random(width/2 + 200);
float l = random(50);
x1.append(-l);
y1.append(r);
}
}
int blah = 0;
void draw() {
fill(255, 20);
rect(-10, -10, width+10, height+10);
for (int i=0; i<=5000; i++) {
float l = x1.get(i);
float r = y1.get(i);
pushMatrix();
translate(width/2, height/2);
//rotate(random(2*PI));
rotate((-blah));
line(-l, r, l, r+l);
popMatrix();
blah++;
blah = blah % 360;
}
}
![Screen Recording 2025-02-07 at 4.55.25 PM (1)](https://global.discourse-cdn.com/julialang/original/3X/d/7/d741f1747ee3a8873935ef711bd04f18236756ab.gif)
And following along with the Youtube channel I linked in my earlier message, I tackled some “advanced projects” over the first few months too. As I recall, this one was my first “big project”, which I basically recreated line for line https://www.youtube.com/watch?v=BjoM9oKOAKY
For the record, 10 years later, I’m an ML engineer who writes a lot of code (mostly in julia and python). I still think Processing (or these days “p5” maybe) is the single best language to learn for any beginner. I think the simplicity and the resources are incomparable.