xxxxxxxxxx
108
//Initial particle numbers
let particle_num = 100;
let particle_arr = []; //Array for all 'particles'
let gravity_arr = []; //Array for gravity
let planet_rad_arr = []; //Array for planet radius
let force = 3; //Velocity force
//Function to check for the 'Inner Position' of the canvas
function inner_canvas(pos) {
if (0 <= pos.x && pos.x <= width && 0 <= pos.y && pos.y <= height) {
return true;
} else {
return false;
}
}
//Function to check if a line vector is too close with another
function too_near(pos) {
let answer = false; //Default value of false
let dist_min = 0;
//For all partitcles, if distance to gravity array < 0, return true
for (let i = 0; i < gravity_arr.length; i++) {
if (p5.Vector.dist(pos, gravity_arr[i]) < dist_min) {
answer = true;
}
}
return answer;
}
function setup() {
createCanvas(800, 600);
// createCanvas(windowWidth, windowHeight);
//Hue-Saturation-Brightness color scheme
colorMode(HSB, 100);
background(0);
// OUTER RING //
//Gravity positions are recalculated every frame, simulating a rotating ring of gravity points.
//DELETE AND SEE WHAT HAPPENS!//
let gravity_points = 100;
for (let i = 0; i < gravity_points; i++) {
//Create vector at center of screen
let center_i = createVector(width / 2, height / 2);
//Rotate the vector WITHOUT changing the magnitude
let i_vec = createVector(0, (-height / 2) * 0.6);
let gravity_i = p5.Vector.add(center_i, i_vec);
append(gravity_arr, gravity_i);
append(planet_rad_arr, 100);
}
// CREATE PARTICLES //
//Create strokes of particles class in the amount specified in the beginning
for (let j = 0; j < particle_num; j++) {
let pos = createVector(random(width), random(height)); //Start at random width and height
let v = createVector(0.1 * force, 0); //Start with same speed
let color = createVector(random(100), 60, 100); //Start with random colors
//Spawn at outer ring
let outer = true;
for (let k = 0; k < gravity_arr.length; k++) {
//If the distance of the particle is less than the inner ring 'planet'
if (p5.Vector.dist(pos, gravity_arr[k]) < planet_rad_arr[k]) {
outer = false;
}
}
//If it is outside, then append the particles to particle array (outer ring)
if (outer) {
append(particle_arr, new Particle(pos, v, color));
}
}
}
function draw() {
background(0, 0, 0, 1);
if (mouseIsPressed === true) {
frameRate(5);
} else {
frameRate(24);
}
//Define gravity strength as the array length
let gravity_points = gravity_arr.length;
//Reset and filled with new values based on the updated positions every frame.
gravity_arr = []; //Array for gravity
planet_rad_arr = []; //Array for planet radius
for (let i = 0; i < gravity_points; i++) {
let center_i = createVector(width/2, height / 2); //Position of the rings
let i_vec = createVector(0, (-height / 2) * 0.6).rotate(
(i / gravity_points) * 2 * PI + frameCount / 70
); //Create rotating vector according to gravity points
let gravity_i = p5.Vector.add(center_i, i_vec); //Saving the previous data of the rings into a new variable
append(gravity_arr, gravity_i); //Append it into gravity array
append(planet_rad_arr, 30); //Append into planet radius
}
//Create a new particle array to store updated particles
let particle_arr_new = [];
for (let i = 0; i < particle_arr.length; i++) {
particle_arr[i].display();
append(particle_arr_new, particle_arr[i]);
}
particle_arr = particle_arr_new;
}