private void updateGraphBounds() { ArborPoint lt = new ArborPoint(-1, -1); ArborPoint rb = new ArborPoint(1, 1); foreach (ArborNode node in this.fNodes) { ArborPoint pt = node.Pt; if (pt.exploded()) { continue; } if (pt.X < lt.X) { lt.X = pt.X; } if (pt.Y < lt.Y) { lt.Y = pt.Y; } if (pt.X > rb.X) { rb.X = pt.X; } if (pt.Y > rb.Y) { rb.Y = pt.Y; } } lt.X -= 1.2; lt.Y -= 1.2; rb.X += 1.2; rb.Y += 1.2; ArborPoint sz = rb.sub(lt); ArborPoint cent = lt.add(sz.div(2)); ArborPoint d = new ArborPoint(Math.Max(sz.X, 4.0), Math.Max(sz.Y, 4.0)).div(2); this.fGraphBounds = new PSBounds(cent.sub(d), cent.add(d)); }
private void updateVelocityAndPosition(double dt) { int size = fNodes.Count; if (size == 0) { EnergySum = 0; EnergyMax = 0; EnergyMean = 0; return; } double eSum = 0; double eMax = 0; // calc center drift ArborPoint rr = new ArborPoint(0, 0); foreach (ArborNode node in fNodes) { rr = rr.sub(node.Pt); } ArborPoint drift = rr.div(size); // main updates loop foreach (ArborNode node in fNodes) { // apply center drift node.applyForce(drift); // apply center gravity if (ParamGravity) { ArborPoint q = node.Pt.mul(-1); node.applyForce(q.mul(ParamRepulsion / 100)); } // update velocities if (node.Fixed) { node.V = new ArborPoint(0, 0); } else { node.V = node.V.add(node.F.mul(dt)); node.V = node.V.mul(1 - ParamFriction); double r = node.V.magnitudeSquare(); if (r > 1000000) { node.V = node.V.div(r); } } node.F.X = node.F.Y = 0; // update positions node.Pt = node.Pt.add(node.V.mul(dt)); // update energy double z = node.V.magnitudeSquare(); eSum += z; eMax = Math.Max(z, eMax); } EnergySum = eSum; EnergyMax = eMax; EnergyMean = eSum / size; }
internal void applyForce(ArborPoint a) { this.F = this.F.add(a.div(this.Mass)); }