public void ApplyForce(ref Body b1, ref Body b2, double deltaT) { var direction = b1.DirectionTo(b2); var dist = direction.Magnitude; var f = G * b1.Mass * b2.Mass / (dist * dist); var dirNorm = direction.UnitVector; b1.Vel -= f * deltaT / b1.Mass * dirNorm; b2.Vel += f * deltaT / b2.Mass * dirNorm; }
public void ApplyForce(ref Body b1, ref Body b2, double deltaT) { if (b1.DistanceTo(b2) > (b1.Radius + b2.Radius) * CollisionDepth) return; if (b1.DistanceTo(b2) < (b1.Radius + b2.Radius) * AbsorbDepth) { if (b1.Mass > b2.Mass) { b1.Mass += b2.Mass; b1.Radius = Math.Sqrt(b1.Radius*b1.Radius + b2.Radius* b2.Radius); b2.Delete(); } else { b2.Mass += b1.Mass; b1.Radius = Math.Sqrt(b1.Radius * b1.Radius + b2.Radius * b2.Radius); b1.Delete(); } } var b1dot = (b1.Vel - b2.Vel) * (b1.Pos - b2.Pos); var b1mag = (b1.Pos - b2.Pos).Magnitude; var b1DotNormal = b1dot / (b1mag * b1mag); var v1delta = (b1.Pos - b2.Pos) * (2 * b2.Mass / (b1.Mass + b2.Mass)) * b1DotNormal; var b2dot = (b2.Vel - b1.Vel) * (b2.Pos - b1.Pos); var b2mag = (b2.Pos - b1.Pos).Magnitude; var b2DotNormal = b2dot / (b2mag * b2mag); var v2Delta = (b2.Pos - b1.Pos) * (2 * b1.Mass / (b1.Mass + b2.Mass)) * b2DotNormal; b1.Vel -= v1delta; b2.Vel -= v2Delta; }
public double DistanceTo(Body other) { return DirectionTo(other).Magnitude; }
public Vector2D DirectionTo(Body other) { return Pos - other.Pos; }
public void ApplyForce(ref Body b1, ref Body b2, double deltaT) { }