public float NextDiscontinuityAfter(float t, DiscontinuousBubble <Position> a, DiscontinuousBubble <Position> b) { var t0 = NextPossibleInteractionAfter(t, a, b); if (t0 > broadPhaseCutoff.Check(a, b)) { return(t0); } else { return(discontinuityFinders.Check(a, b)); } }
public float NextPossibleInteractionAfter(float t, DiscontinuousBubble <Position> a, DiscontinuousBubble <Position> b) { var aBoundaryRadius = a.GetBoundaryRadius(); var bBoundaryRadius = b.GetBoundaryRadius(); var aCurrentRadius = aBoundaryRadius.At(t); var bCurrentRadius = bBoundaryRadius.At(t); var similarity = a.GetPosition().SimilarityTo(b.GetPosition()); if (similarity < aCurrentRadius + bCurrentRadius) { // Bubbles' regions of influence already overlap return(float.NegativeInfinity); } var jointRadius = functionAdder.Sum(aBoundaryRadius, bBoundaryRadius); return((functionAdder.Sum(jointRadius, new Constant(-(aCurrentRadius + bCurrentRadius)))).Root() ?? float.PositiveInfinity); }
/// <summary> /// Resolve the next discontinuity between a binary bubble and some other /// discontinuous bubble. /// </summary> /// <param name="solver">Solver.</param> /// <param name="after">After.</param> /// <param name="binaryBubble">Binary bubble.</param> /// <param name="other">Other.</param> public static void PairResolveDiscontinuityAfter(BubbleInteractionSolver <Position> solver, float after, BinaryBubble <Position> binaryBubble, DiscontinuousBubble <Position> other) { // TODO: cache this part from the previous function var leftNextDiscontinuity = solver.NextDiscontinuityAfter( after, binaryBubble.Left, other); var rightNextDiscontinuity = solver.NextDiscontinuityAfter( after, binaryBubble.Right, other); if (leftNextDiscontinuity < rightNextDiscontinuity) { solver.ResolveNextDiscontinuityAfter(after, binaryBubble.Left, other); } else { solver.ResolveNextDiscontinuityAfter(after, binaryBubble.Right, other); } }
/// <summary> /// Find the time of the next discontinuity between a binary bubble and /// some other discontinuous bubble. /// </summary> /// <returns>The next discontinuity after.</returns> /// <param name="solver">Solver.</param> /// <param name="after">After.</param> /// <param name="binaryBubble">Binary bubble.</param> /// <param name="other">Other.</param> public static float PairNextDiscontinuityAfter(BubbleInteractionSolver <Position> solver, float after, BinaryBubble <Position> binaryBubble, DiscontinuousBubble <Position> other) { var leftNextDiscontinuity = solver.NextDiscontinuityAfter( after, binaryBubble.Left, other); var rightNextDiscontinuity = solver.NextDiscontinuityAfter( after, binaryBubble.Right, other); // TODO: cache the result somehow return(leftNextDiscontinuity < rightNextDiscontinuity ? leftNextDiscontinuity : rightNextDiscontinuity); }
public void ResolveNextDiscontinuityAfter(float t, DiscontinuousBubble <Position> a, DiscontinuousBubble <Position> b) { discontinuityResolvers.Check(a, b); }