xxxxxxxxxx
102
/* Some code adapted from the Coding Train */
let fluid;
let PERIOD = 6;
var days;
var daysPassed;
function setup() {
createCanvas(400, 400);
days = 1;
daysPassed = false;
fluid = new Fluid(0.2, 0, 0.0000001);
}
function draw() {
stroke(51);
strokeWeight(2);
let cx = int(0.5 * width / SCALE);
let cy = int(0.5 * height / SCALE);
for (let i = -2; i <= 2; i++) {
for (let j = -2; j <= 2; j++) {
fluid.addDensity(cx + i, cy + j,
doubleEllipticOgee(second()*0.01, 0.270,0.707)*100);
}
}
for (let i = 0; i < 2; i++) {
let angle = radians(map(second(), 0, 60, -90, 270));
let v = p5.Vector.fromAngle(angle);
v.mult(0.2);
t += 0.01;
fluid.addVelocity(cx, cy, v.x, v.y);
}
fluid.step();
fluid.renderD();
drawPeriodDays();
}
function drawPeriodDays() {
push();
angleMode(DEGREES);
noFill();
translate(200, 200);
rotate(-90);
calculateDays();
let endDay = map(days%28, 0, 28, 0, 360);
let endPeriod = map(min(PERIOD, days%28), 0, 28, 0, 360);
stroke(255);
strokeWeight(1);
arc(0, 0, 240, 240, 0, endDay);
strokeWeight(3);
stroke(255, 100, 100);
if (days%28 != 0){
arc(0, 0, 240, 240, 0, endPeriod);
}
pop();
}
function doubleEllipticOgee(_x, _a, _b)
{
if(!_a) _a = 0.25; // default
if(!_b) _b = 0.75; // default
var min_param_a = 0.0 + Number.EPSILON;
var max_param_a = 1.0 - Number.EPSILON;
_a = constrain(_a, min_param_a, max_param_a);
var _y = 0;
if (_x<=_a){
_y = (_b/_a) * sqrt(sq(_a) - sq(_x-_a));
}
else {
_y = 1.0 - ((1.0-_b)/(1.0-_a))*sqrt(sq(1.0-_a) - sq(_x-_a));
print((sq(1.0-_a) - sq(_x-_a)));
}
return(_y);
}
function calculateDays() {
if (hour() == 0 && minute() == 0 && second() == 0) {
if(daysPassed == false){
days ++;
daysPassed = true;
}
}
if (hour() != 0 || minute() != 0 || second() != 0) {
daysPassed = false;
}
}