Example #1
0
        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);
            }
        }
Example #2
0
    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);
        }
    }
Example #3
0
        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);
        }
Example #4
0
        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++;
                }
            }
        }