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)); } }
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); } }