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);
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        /// <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);
 }