public void Do(Func <GWNode <EDND, EDED, EDGD>, GWNode <EDND, EDED, EDGD>, double> forceConnected, Func <GWNode <EDND, EDED, EDGD>, GWNode <EDND, EDED, EDGD>, double> forceNonConnected) { StopSimulation = false; Iteration = 0; double nodeCount = Graph.Nodes.Count; var startTime = DateTime.Now; //prepare var center = new Force(); foreach (var node in Graph.Nodes) { node.Data.Object3D.X = rdm.Next(100); node.Data.Object3D.Y = rdm.Next(100); node.Data.Object3D.Z = rdm.Next(100); center.Add(node.Data.Object3D); } //center center.Multiply(-1.0 / nodeCount); if (CenterBalancePoint) { foreach (var node in Graph.Nodes) { node.Data.Object3D.Move(center); } } var nodes = Graph.Nodes.ToList().RemoveWhere(n => !n.Neighbours.Any()).ToList(); if (nodes.NotNullOrEmpty()) { innerRunEmbed(forceConnected, forceNonConnected); } }
void Collision(double weight) { var collided = _simulation.Search.GetClosests(this); double radius = _simulation.Radius; foreach (Particle collider in collided) { if (Neighbours[0] == collider || Neighbours[1] == collider) { continue; } //if (Neighbours.Contains(collider)) continue; Vector3d vector = collider._p - _p; double distance = vector.Length; vector *= ((distance - radius) / distance) * 0.5 * weight; Delta.Add(vector, weight); collider.Delta.Add(-vector, weight); } }
public void TestOperators() { Force f1 = new Force(1, 3, -2); Force f2 = new Force(0, -1, 1); AreEqual(new Force(1, 2, -1), f1 + f2); AreEqual(new Force(1, 2, -1), f1.Add(f2)); AreEqual(new Force(1, 2, -1), f2.Add(f1)); AreEqual(new Force(1, 4, -3), f1 - f2); AreEqual(new Force(1, 4, -3), f1.Substract(f2)); AreEqual(new Force(1, 4, -3), Force.Zero - f2.Substract(f1)); AreEqual(Force.Zero, f1.Multiply(0)); AreEqual(Force.Zero, f1 * 0); AreEqual(new Force(2, 6, -4), f1 * 2); }
private void innerRunEmbed(Func <GWNode <EDND, EDED, EDGD>, GWNode <EDND, EDED, EDGD>, double> forceConnected, Func <GWNode <EDND, EDED, EDGD>, GWNode <EDND, EDED, EDGD>, double> forceNonConnected) { var nodes = Graph.Nodes.ToArray(); while (!StopSimulation && !IsInPause) { var rdmNode = nodes.RandomTake(1, rdm).First(); var force = new Force(); var doTunneling = false;// rdm.NextDouble() < 0.01; foreach (var nb in Graph.Nodes) { if (nb.GraphId == rdmNode.GraphId) { continue; } CategoryFactor = 0.025; if (rdmNode.Neighbours.Contains(nb)) { var strength = forceConnected(rdmNode, nb); if (UseCategories && nb.Data.Category != rdmNode.Data.Category) { strength *= CategoryFactor; } var direction = nb.Data.Object3D.Minus(rdmNode.Data.Object3D); direction.Normalize(); direction.Multiply(strength); force.Add(direction); } if (!doTunneling) { var strength = forceNonConnected(nb, rdmNode); if (UseCategories && nb.Data.Category == rdmNode.Data.Category) { strength *= CategoryFactor; } var direction = nb.Data.Object3D.Minus(rdmNode.Data.Object3D); direction.Normalize(); direction.Multiply(strength); force.Add(direction); } //add force to 2D - plane // force.Add(new Vector(0, 0, -rdmNode.Data.Object3D.Z / 500.0)); Temperature = 1; force.Multiply(Temperature); rdmNode.Data.Object3D.Move(force); if (CenterBalancePoint) { force.Multiply(-1.0 / nodes.Length); foreach (var node in Graph.Nodes) { node.Data.Object3D.Move(force); } } Iteration++; } } }