예제 #1
0
        private void applySprings()
        {
            foreach (ArborEdge edge in fEdges)
            {
                ArborPoint s    = edge.Target.Pt.sub(edge.Source.Pt);
                double     sMag = s.magnitude();

                ArborPoint r = ((sMag > 0) ? s : ArborPoint.newRnd(1)).normalize();
                double     q = edge.Stiffness * (edge.Length - sMag);

                edge.Source.applyForce(r.mul(q * -0.5));
                edge.Target.applyForce(r.mul(q * 0.5));
            }
        }
예제 #2
0
        public void applyForces(ArborNode m, double g)
        {
            try
            {
                Queue <object> f = new Queue <object>();

                f.Enqueue(fRoot);
                while (f.Count > 0)
                {
                    object obj = f.Dequeue();
                    if (obj == null || obj == m)
                    {
                        continue;
                    }

                    ArborPoint ptx, i, k;
                    double     l, kMag, massx;

                    if (obj is ArborNode)
                    {
                        ArborNode node = (obj as ArborNode);
                        massx = node.Mass;
                        ptx   = node.Pt;

                        k    = m.Pt.sub(ptx);
                        kMag = k.magnitudeSquare();

                        i = ((kMag > 0) ? k : ArborPoint.newRnd(1)).normalize();
                        l = Math.Max(1, kMag);
                        m.applyForce(i.mul(g * massx).div(l));
                    }
                    else
                    {
                        Branch branch = (obj as Branch);
                        massx = branch.Mass;
                        ptx   = branch.Pt.div(massx);

                        k    = m.Pt.sub(ptx);
                        kMag = k.magnitudeSquare();

                        double h = branch.Size.X * branch.Size.Y;
                        if (h / kMag > fDist)
                        {
                            f.Enqueue(branch.Q[QNe]);
                            f.Enqueue(branch.Q[QNw]);
                            f.Enqueue(branch.Q[QSe]);
                            f.Enqueue(branch.Q[QSw]);
                        }
                        else
                        {
                            i = ((kMag > 0) ? k : ArborPoint.newRnd(1)).normalize();
                            l = Math.Max(1, kMag);
                            m.applyForce(i.mul(g * massx).div(l));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("BarnesHutTree.applyForces(): " + ex.Message);
            }
        }