Implement 3D pocket-ball collision logic #179
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Pocket collision logic for 3D is added. If ball lands in pocket circle, pocket. If ball flies through with outflux height <7/5*R, the ball is pocketed. Otherwise it is not. Details in
ball_pocket_collision_time_airborne
docstringquadratic.solve and quartic.solve now have the same ins/outs
quadratic.solve is now a general quadratic solver, capable of returning complex roots
It's also less susceptible to catastrophic cancellation (a numerical stability issue)
roots.core got an upgrade. Of note is filter_non_physical_roots and filter_non_physical_roots_many, which take roots and determine heuristically whether they are non-negative, finite, and have a permissibly small imaginary component. This logic existed in the quartic solver, but now has been exposed as a core functionality that can be used any collection of roots (e.g. those calculated from the quadratic solver).