[docs]@attrs.defineclassFrictionlessElastic(CoreBallBallCollision):"""A frictionless, instantaneous, elastic, equal mass collision resolver. This is as simple as it gets. See Also: - This physics of this model is blogged about at https://ekiefl.github.io/2020/04/24/pooltool-theory/#1-elastic-instantaneous-frictionless """model:BallBallModel=attrs.field(default=BallBallModel.FRICTIONLESS_ELASTIC,init=False,repr=False)
[docs]defsolve(self,ball1:Ball,ball2:Ball)->Tuple[Ball,Ball]:"""Resolves the collision."""rvw1,rvw2=_resolve_ball_ball(ball1.state.rvw.copy(),ball2.state.rvw.copy(),ball1.params.R,)ball1.state=BallState(rvw1,const.sliding)ball2.state=BallState(rvw2,const.sliding)returnball1,ball2