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,Protocol,Tuple,Type,castimportattrsimportnumpyasnpimportpooltool.constantsasconstfrompooltool.objects.ball.datatypesimportBall,BallStatefrompooltool.objects.table.componentsimportPocketfrompooltool.physics.resolve.modelsimportBallPocketModel
[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"""...
@attrs.defineclassCanonicalBallPocket:model:BallPocketModel=attrs.field(default=BallPocketModel.CANONICAL,init=False,repr=False)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_ball_pocket_model_registry:Tuple[Type[BallPocketStrategy],...]=(CanonicalBallPocket,)ball_pocket_models:Dict[BallPocketModel,Type[BallPocketStrategy]]={cast(BallPocketModel,attrs.fields_dict(cls)["model"].default):clsforclsin_ball_pocket_model_registry}