xxxxxxxxxx
236
//
// Neurons
// by Philip, original particles November 15, 2020
//
// Neural network
//
// Click on a neuron to fire or move it.
//
// Kinetic energy of all neurons is indicated in lower left corner.
//
// Edit 'num' to change how many neurons there are in simulation. Just a few will let you
// play with driving, trapping neurons, etc. Set to 100 to see crowd/gas.
// More damping means slow down faster, less means keep moving.
//
//
let num = 10;
let numDendrites = 3; // Per Neuron
let maxEnergy = 100;
let energyRechargeRate = 0.1;
let neurons = [];
let key_up = 0;
let key_down = 0;
let key_left = 0;
let key_right = 0;
let key_b = 0;
let mouseDown = false;
let grabOrigin = 0;
function setup() {
createCanvas(600, 400);
//fullscreen(true);
noStroke();
grabOrigin = createVector(0,0);
//. Create vector valued grid
print("Setup");
for (let i = 0; i < num; i++) {
let size = 20;
neurons[i] = new neuron(random(width),
random(height),
size,
neurons,
i);
}
}
function draw() {
background(128);
for (let i = 0; i < num; i++) {
neurons[i].update();
neurons[i].display();
}
noStroke();
strokeWeight(1);
fill(0);
}
// neuron class
function neuron (_x, _y, _s, _others,
_id) {
// Screen values
this.position = createVector(_x, _y);
this.size = _s;
this.grabOrigin = createVector(0,0);
this.isSelected = false;
this.color = color(random(255), random(255), random(255));
this.dt = 1.0 / 60.0;
this.energy = random(-maxEnergy, maxEnergy);
this.over = false;
this.move = false;
this.friends = _others;
this.id = _id;
this.dendrites = [];
this.weights = [];
for (let i = 0; i < numDendrites; i++) {
this.dendrites[i] = floor(random(num));
this.weights[i] = random(-1,1);
}
this.update = function() {
// If dragging, set position to mouse
if (mouseDown && this.isSelected) {
this.position.set(createVector(mouseX, mouseY));
}
// Refuel energy
if (this.energy < 0) {
this.energy += 1;
}
if (this.overEvent()) {
this.over = true;
} else {
this.over = false;
}
}
// Test to see if mouse is over this neuron
this.overEvent = function() {
return (createVector(this.position.x - mouseX, this.position.y - mouseY).mag() < this.size / 2 );
}
this.kE = function() {
return this.kineticEnergy;
}
this.display = function() {
if (this.over || this.isSelected) {
stroke(255);
strokeWeight(3);
} else {
stroke(0);
strokeWeight(1);
}
if (this.energy < 0) {
fill('red');
} else {
fill(this.color);
}
ellipse(this.position.x, this.position.y, this.size, this.size);
let energyLevel = this.energy / maxEnergy;
if (energyLevel < 0.99) {
strokeWeight(1);
fill(128, 128, 128, 128);
ellipse(this.position.x, this.position.y,
this.size * energyLevel, this.size * energyLevel)
}
// if being grabbed, draw controller
if (mouseDown && this.isSelected) {
stroke(255);
strokeWeight(4);
let controller = p5.Vector.sub(createVector(mouseX, mouseY), grabOrigin);
controller.add(this.position);
line(this.position.x, this.position.y, controller.x, controller.y);
}
// draw Dendrites
strokeWeight(2);
stroke(0);
for (let i = 0; i < numDendrites; i++) {
let dv = createVector(this.friends[this.dendrites[i]].position).sub(this.position);
let d = dv.mag();
dv.normalize();
dv.mult(20); //d - this.friends[this.dendrites[i]].size/2);
dv.add(this.position);
stroke()
line(this.position.x, this.position.y,
this.friends[this.dendrites[i]].position.x,
this.friends[this.dendrites[i]].position.y);
//stroke(255,0,0);
//ellipse(dv.x, dv.y, 10, 10);
}
}
};
function keyPressed() {
if (keyCode === LEFT_ARROW || keyCode === 65) {
key_left = 1;
}
if (keyCode === RIGHT_ARROW || keyCode === 68) {
key_right = 1;
}
if (keyCode === UP_ARROW || keyCode === 87) {
key_up = 1;
}
if (keyCode === DOWN_ARROW || keyCode === 83) {
key_down = 1;
}
if (keyCode === 66) {
key_b = 1;
}
}
function keyReleased() {
if (keyCode === LEFT_ARROW || keyCode === 65) {
key_left = 0;
}
if (keyCode === RIGHT_ARROW || keyCode === 68) {
key_right = 0;
}
if (keyCode === UP_ARROW || keyCode === 87) {
key_up = 0;
}
if (keyCode === DOWN_ARROW || keyCode === 83) {
key_down = 0;
}
if (keyCode === 66) {
key_b = 0;
}
}
function mousePressed() {
mouseDown = true;
grabOrigin.set(mouseX, mouseY);
for (let i = 0; i < num; i++) {
let disX = neurons[i].position.x - mouseX;
let disY = neurons[i].position.y - mouseY;
let dis = createVector(disX, disY);
if (dis.mag() < neurons[i].size / 2 ) {
neurons[i].isSelected = true;
} else {
neurons[i].isSelected = false;
}
}
}
function mouseReleased() {
mouseDown = false;
}