Source code for pooltool.physics.resolve.ball_pocket
"""Defining and handling ball pocket collisionsNote: If this module is ever extended to support multiple treatments for ball pocket collisions, expand this file into a file structure modelled after ../ball_ball or ../ball_cushion"""fromtypingimportDict,Optional,Protocol,Tuple,Typeimportnumpyasnpimportpooltool.constantsasconstfrompooltool.objects.ball.datatypesimportBall,BallStatefrompooltool.objects.table.componentsimportPocketfrompooltool.physics.resolve.typesimportModelArgsfrompooltool.utils.strenumimportStrEnum,auto
[docs]classBallPocketStrategy(Protocol):"""Ball-pocket collision models must satisfy this protocol"""
[docs]defresolve(self,ball:Ball,pocket:Pocket,inplace:bool=False)->Tuple[Ball,Pocket]:"""This method resolves a ball-circular cushion collision"""...
classCanonicalBallPocket:defresolve(self,ball:Ball,pocket:Pocket,inplace:bool=False)->Tuple[Ball,Pocket]:ifnotinplace:ball=ball.copy()pocket=pocket.copy()# Ball is placed at the pocket centerrvw=np.array([[pocket.a,pocket.b,-pocket.depth],[0,0,0],[0,0,0],])ball.state=BallState(rvw,const.pocketed)pocket.add(ball.id)returnball,pocket
[docs]classBallPocketModel(StrEnum):"""An Enum for different ball-pocket collision models Attributes: CANONICAL: Sets the ball into the bottom of pocket and sets the state to pocketed (:class:`CanonicalBallPocket`). """CANONICAL=auto()
[docs]defget_ball_pocket_model(model:Optional[BallPocketModel]=None,params:ModelArgs={})->BallPocketStrategy:"""Returns a ball-pocket collision model Args: model: An Enum specifying the desired model. If not passed, :class:`CanonicalBallPocket` is passed with empty params. params: A mapping of parameters accepted by the model. Returns: An instantiated model that satisfies the :class:`BallPocketStrategy` protocol. """ifmodelisNone:returnCanonicalBallPocket()return_ball_pocket_models[model](**params)