Ejemplo n.º 1
0
class Move:
    MIN_AngleOfStrike = np.pi - ((86 * np.pi) / 180)
    GHOSTBALL_CLS_FACTOR = 1
    CONST_P1 = 1.602
    CONST_P2 = 20.49

    def __init__(self, cue=None, pocket=None, target=None):
        self.cue = cue
        self.pocket = pocket
        self.target = target
        self.ghostball = None
        self.target_vec = None
        self.aiming_vec = None
        self.shotangle = None
        self.valid = False
        self.target_vel = 0
        self.v = 0
        self.VStrikes = []
        self.SimResultNode = None
        self.gametable_id = None
        self.a = 0
        self.b = 0
        self.impact_vel = 0

    def CalcShotAngle(self):
        shifted_pckt = self.pocket.center - self.target.loc
        self.ghostball = (self.target.loc + self.cue.Diameter *
                          (self.target.loc - self.pocket.center) /
                          self.pocket.center.distance(self.target.loc))
        self.aiming_vec = Segment(self.cue.loc, self.ghostball)
        self.target_vec = Segment(self.pocket.center, self.ghostball)
        self.shotangle = self.aiming_vec.angle_between(self.target_vec).evalf()
        shifted_ghost = self.ghostball - self.cue.loc
        self.aiming_vec_ag = math.atan(shifted_ghost.y / shifted_ghost.x)
        if shifted_ghost.x < 0:
            self.aiming_vec_ag = math.pi + self.aiming_vec_ag

    def CheckValidity(self, table):
        if self.shotangle > self.MIN_AngleOfStrike:
            for ball in table.balls.values():
                if ball.BallName != self.target.BallName:
                    min_dst_to_aiming_line = self.aiming_vec.perpendicular_segment(
                        ball.loc).length.evalf()
                    min_dst_to_target_line = self.target_vec.perpendicular_segment(
                        ball.loc).length.evalf()
                    if min_dst_to_aiming_line < ball.Diameter or min_dst_to_target_line < ball.Diameter:
                        self.valid = False
                        return f'{ball.BallName} adda ide'
            self.valid = True
            self.CalcMinVelocity_reqd()
            return f'hodi tondare illa'
        return 'shotangle not valid'

    @staticmethod
    def signof(x):
        return 1 if x > 0 else -1

    def CalcMinVelocity_reqd(self):
        self.target_vel = self.CONST_P1 * self.target_vec.length + self.CONST_P2  ##from VDModel
        self.impact_vel = 2 * self.target_vel * math.cos(
            math.pi - self.shotangle
        )  ##conservation of momentum in 2D same ball mass ans elastic collission
        self.v = self.impact_vel + (self.CONST_P1 * self.aiming_vec.length +
                                    self.CONST_P2)

    def SpawnVStrikes(self):
        self.VStrikes = []
        for i in range(abs((VStrike.v_max - self.v) // VStrike.v_step)):
            self.VStrikes.append(
                VStrike(self.v + i * VStrike.v_step, self.aiming_vec_ag))

    def __repr__(self):
        return ','.join(f'{key}:{value}'
                        for key, value in self.__dict__.items())