Skip to content

Instantly share code, notes, and snippets.

@sroccaserra
Created January 8, 2020 14:52
Show Gist options
  • Save sroccaserra/9388fc89dfc6413b2a1b26e2f4d07631 to your computer and use it in GitHub Desktop.
Save sroccaserra/9388fc89dfc6413b2a1b26e2f4d07631 to your computer and use it in GitHub Desktop.
Paysage des lunes en 3d de Jonathan pour la fête colorée de fin d'année
// https://paysage.xyz/playground/fcfa/programmer
// https://adventofcode.com/2019/day/12
var moons = [];
moons.push(new PVector(-6, 2, -9));
moons.push(new PVector(12, -14, -4));
moons.push(new PVector(9, 5, -6));
moons.push(new PVector(-1, -4, 9));
for(var m in moons) {
var moon = moons[m];
moon.vel = new PVector(0, 0, 0);
moon.index = m;
}
var scale = 8;
void setup() {
colorMode(HSB, 100);
}
var zoom = 500;
var viewdist = 350;
var viewangle = 0.5;
function transform(x, y, z) {
var xr = x * cos(viewangle) + z * sin(viewangle);
var yr = y;
var zr = -x * sin(viewangle) + z * cos(viewangle);
zr += viewdist;
return new PVector(zoom * xr / zr, -zoom * yr / zr, zoom / zr);
}
function vertex3d(x, y, z) {
var p = transform(x, y, z);
vertex(p.x, p.y);
}
var gridY = -150;
void drawgrid() {
beginShape(LINES);
var gridWidth = 400, gridHeight = 400, gridCell = 20;
for(var x=-gridWidth/2; x <= gridWidth/2; x += gridCell) {
vertex3d(x, gridY, -gridHeight/2);
vertex3d(x, gridY, gridHeight/2);
}
for(var z=-gridHeight/2; z <= gridHeight/2; z += gridCell) {
vertex3d(-gridWidth/2, gridY, z);
vertex3d(gridWidth/2, gridY, z);
}
endShape();
}
void draw() {
background(0,0);
fill(200, 80, 80);
translate(width/2, height/2);
stroke(105);
var inc = .001;
var simscale = 1;
for(int m1 = 0; m1 < moons.length; m1++) {
for(int m2 = 0; m2 < moons.length; m2++) {
if(m1 == m2) continue;
var moon1 = moons[m1], moon2 = moons[m2];
if(moon1.x < moon2.x) moon1.vel.x+=inc;
if(moon1.x > moon2.x) moon1.vel.x-=inc;
if(moon1.y < moon2.y) moon1.vel.y+=inc;
if(moon1.y > moon2.y) moon1.vel.y-=inc;
if(moon1.z < moon2.z) moon1.vel.z+=inc;
if(moon1.z > moon2.z) moon1.vel.z-=inc;
}
}
for(var m in moons) {
var moon = moons[m];
moon.add(PVector.mult(moon.vel, simscale));
}
stroke(0, 0, 50);
strokeWeight(1);
drawgrid();
var transformedMoons = moons.forEach(function(moon) {
moon.transformed = transform(moon.x * scale, moon.y * scale, moon.z * scale);
});
moons.sort(function(ma, mb) {
return ma.transformed.z - mb.transformed.z;
});
noStroke();
for(var m in moons) {
var moon = moons[m];
var r = 30;
var p = moon.transformed;
pushStyle();
stroke(0);
strokeWeight(0);
fill(moon.index * 20, 80, 80);
ellipse(p.x, p.y, p.z * r, p.z * r);
popStyle();
fill(moon.index * 20, 70, 100);
var specoff=r/30, specsize=0.8;
ellipse(p.x - specoff * p.z, p.y - specoff * p.z, p.z * r * specsize, p.z * r * specsize);
var p = transform(moon.x * scale, gridY, moon.z * scale);
fill(0, 0, 60, 100);
ellipse(p.x, p.y, p.z * r, .4*r*p.z);
}
viewangle += 0.01;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment