|
@@ -34,7 +34,7 @@
|
|
|
// var _stage = new createjs.Stage('edlp-map');
|
|
|
var _nodes = [];
|
|
|
// var _particules = [];
|
|
|
- var _p_radius = 3; // nodes radius (real radius, not diametre)
|
|
|
+ var _base_radius = 3; // nodes radius (real radius, not diametre)
|
|
|
var _p_velocity_factor = 0.5;
|
|
|
var _m_pos = {x:0, y:0};
|
|
|
var _node_hover_id = -1;
|
|
@@ -129,7 +129,7 @@
|
|
|
|
|
|
this.debug = d;
|
|
|
this.mass = 8;
|
|
|
- this.base_radius = _p_radius;
|
|
|
+ this.base_radius = _base_radius;
|
|
|
this.g = {
|
|
|
l : 1, // drawing line width
|
|
|
s : 1 // drawing space between squares
|
|
@@ -145,6 +145,7 @@
|
|
|
this.y = this.wall_limits.top + Math.random()*(this.wall_limits.bottom - this.wall_limits.top);
|
|
|
|
|
|
this.hover = false;
|
|
|
+
|
|
|
// physics
|
|
|
this.p = _physics.makeParticle(this.mass, this.x, this.y);
|
|
|
this.p.velocity = new Physics.Vector((Math.random()-0.5)*_p_velocity_factor, (Math.random()-0.5)*_p_velocity_factor);
|
|
@@ -206,7 +207,7 @@
|
|
|
&& _m_pos.y > this.y - this.real_radius
|
|
|
&& _m_pos.y < this.y + this.real_radius){
|
|
|
if(_node_hover_id == -1 || _node_hover_id == this.id){
|
|
|
- console.log("Node hover", this.id);
|
|
|
+ // console.log("Node hover", this.id);
|
|
|
this.hover = true;
|
|
|
this.highlightEntries();
|
|
|
_node_hover_id = this.id;
|
|
@@ -235,7 +236,7 @@
|
|
|
_ctx.beginPath();
|
|
|
_ctx.lineWidth = this.g.l*2;//this.hover ? this.g.l*2 : this.g.l;
|
|
|
var r,d;
|
|
|
- for (var i = 0; i < this.entrees.length; i++) {
|
|
|
+ for (let i = 0; i < this.entrees.length; i++) {
|
|
|
// _ctx.fillStyle = i == 0 ? _entrees_colors[this.entrees[i]] : "#fff";
|
|
|
// _ctx.strokeStyle = _entrees_colors[this.entrees[i]];
|
|
|
_ctx.fillStyle = i == 0 ? edlp_vars['e_col_'+this.entrees[i]] : "#fff";
|
|
@@ -266,53 +267,70 @@
|
|
|
// / ____/ / / / /_/ (__ ) / /__(__ )
|
|
|
// /_/ /_/ /_/\__, /____/_/\___/____/
|
|
|
// /____/
|
|
|
- // TODO: how to use particule collision in new OOP Node() contexte
|
|
|
+ // TODO: we may convert a lot of computation into a web worker https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
|
|
|
function checkParticulesCollisions(){
|
|
|
+ // pre create vars to save memory;
|
|
|
+ var node_a, node_b, p_a, p_b,
|
|
|
+ d, full_rad,
|
|
|
+ newVelX1, newVelY1, newVelX2, newVelY2,
|
|
|
+ makeup, angle;
|
|
|
// colisions between _particules
|
|
|
- for (var p = 0, l = _particules.length; p < l; p++) {
|
|
|
- var particule = _particules[p];
|
|
|
- // var theta = 360 / (Math.PI * _p_radius);
|
|
|
- if(!particule.attracted) continue;
|
|
|
- for (var q = 0; q < p; q++) {
|
|
|
- if(q==p) continue;
|
|
|
-
|
|
|
- var a = particule;
|
|
|
- var b = _particules[q];
|
|
|
- if(!b.attracted) continue;
|
|
|
- var d = a.distanceTo(b);
|
|
|
+ for (var n = 0, l = _nodes.length; n < l; n++) {
|
|
|
+ node_a = _nodes[n];
|
|
|
+ p_a = node_a.p;
|
|
|
+ // console.log(`p_a`, p_a.attracted);
|
|
|
+ // var theta = 360 / (Math.PI * _base_radius);
|
|
|
+ // if(!p_a.attracted) continue;
|
|
|
+ // console.log('test');
|
|
|
+ for (var q = 0; q < n; q++) {
|
|
|
+ if(q===n) continue;
|
|
|
+
|
|
|
+ node_b = _nodes[q];
|
|
|
+ p_b = node_b.p;
|
|
|
+ // if(!p_b.attracted) continue;
|
|
|
+ d = p_a.distanceTo(p_b);
|
|
|
+
|
|
|
+ full_rad = node_a.real_radius + node_b.real_radius;
|
|
|
+
|
|
|
+ // if not colliding skip following
|
|
|
+ if(d > full_rad) continue;
|
|
|
|
|
|
// apply new forces if colliding
|
|
|
- if(d <= _p_radius*2){
|
|
|
+ newVelX1 = (p_a.velocity.x * (p_a.mass - p_b.mass)
|
|
|
+ + (2 * p_b.mass * p_b.velocity.x)) / (p_a.mass + p_b.mass);
|
|
|
+ newVelY1 = (p_a.velocity.y * (p_a.mass - p_b.mass)
|
|
|
+ + (2 * p_b.mass * p_b.velocity.y)) / (p_a.mass + p_b.mass);
|
|
|
+ newVelX2 = (p_b.velocity.x * (p_b.mass - p_a.mass)
|
|
|
+ + (2 * p_a.mass * p_a.velocity.x)) / (p_a.mass + p_b.mass);
|
|
|
+ newVelY2 = (p_b.velocity.y * (p_b.mass - p_a.mass)
|
|
|
+ + (2 * p_a.mass * p_a.velocity.y)) / (p_a.mass + p_b.mass);
|
|
|
|
|
|
- var newVelX1 = (a.velocity.x * (a.mass - b.mass) + (2 * b.mass * b.velocity.x)) / (a.mass + b.mass);
|
|
|
- var newVelY1 = (a.velocity.y * (a.mass - b.mass) + (2 * b.mass * b.velocity.y)) / (a.mass + b.mass);
|
|
|
- var newVelX2 = (b.velocity.x * (b.mass - a.mass) + (2 * a.mass * a.velocity.x)) / (a.mass + b.mass);
|
|
|
- var newVelY2 = (b.velocity.y * (b.mass - a.mass) + (2 * a.mass * a.velocity.y)) / (a.mass + b.mass);
|
|
|
+ p_a.velocity.x = newVelX1;
|
|
|
+ p_a.velocity.y = newVelY1;
|
|
|
+ p_b.velocity.x = newVelX2;
|
|
|
+ p_b.velocity.y = newVelY2;
|
|
|
|
|
|
- a.velocity.x = newVelX1;
|
|
|
- a.velocity.y = newVelY1;
|
|
|
- b.velocity.x = newVelX2;
|
|
|
- b.velocity.y = newVelY2;
|
|
|
+ p_a.velocity.multiplyScalar(0.75);
|
|
|
+ p_b.velocity.multiplyScalar(0.75);
|
|
|
|
|
|
- a.velocity.multiplyScalar(0.75);
|
|
|
- b.velocity.multiplyScalar(0.75);
|
|
|
|
|
|
+ // move particles if they overlap
|
|
|
+ if (d < full_rad) {
|
|
|
+ makeup = full_rad/2 - d/2;
|
|
|
+ angle = Math.atan2(p_b.position.y - p_a.position.y, p_b.position.x - p_a.position.x);
|
|
|
|
|
|
- // move particles if they overlap
|
|
|
- if (d < _p_radius*2) {
|
|
|
- var makeup = _p_radius - d/2;
|
|
|
- var angle = Math.atan2(b.position.y - a.position.y, b.position.x - a.position.x);
|
|
|
+ p_b.position.x += makeup * Math.cos(angle);
|
|
|
+ p_b.position.y += makeup * Math.sin(angle);
|
|
|
|
|
|
- b.position.x += makeup * Math.cos(angle);
|
|
|
- b.position.y += makeup * Math.sin(angle);
|
|
|
+ angle += Math.PI;
|
|
|
|
|
|
- angle += Math.PI;
|
|
|
+ p_a.position.x += makeup * Math.cos(angle);
|
|
|
+ p_a.position.y += makeup * Math.sin(angle);
|
|
|
|
|
|
- a.position.x += makeup * Math.cos(angle);
|
|
|
- a.position.y += makeup * Math.sin(angle);
|
|
|
-
|
|
|
- }
|
|
|
}
|
|
|
+
|
|
|
+ _nodes[n].p = p_a;
|
|
|
+ _nodes[q].p = p_b;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -326,7 +344,7 @@
|
|
|
_$canvas
|
|
|
.on('mousemove', function(event) {
|
|
|
event.preventDefault();
|
|
|
- console.log("onMouseMove");
|
|
|
+ // console.log("onMouseMove");
|
|
|
_m_pos.x = event.originalEvent.clientX;
|
|
|
_m_pos.y = event.originalEvent.clientY;
|
|
|
// console.log("/ _ / - / _ /");
|
|
@@ -369,14 +387,17 @@
|
|
|
function render(){
|
|
|
_ctx.clearRect(0, 0, _canvas.width, _canvas.height);
|
|
|
|
|
|
+ checkParticulesCollisions();
|
|
|
+
|
|
|
for (var i = 0; i < _nodes.length; i++) {
|
|
|
_nodes[i].onUpdate();
|
|
|
}
|
|
|
- if(_node_hover_id != -1){
|
|
|
- _canvas.style.cursor = 'pointer';
|
|
|
- }else{
|
|
|
- _canvas.style.cursor = 'auto';
|
|
|
- }
|
|
|
+ // if(_node_hover_id != -1){
|
|
|
+ // _canvas.style.cursor = 'pointer';
|
|
|
+ // }else{
|
|
|
+ // _canvas.style.cursor = 'auto';
|
|
|
+ // }
|
|
|
+ _canvas.style.cursor = _node_hover_id != -1 ? 'pointer' : 'auto';
|
|
|
};
|
|
|
|
|
|
function startAnime(){
|